导入FlaskSQLAlchemy时:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy


我继续声明appdb对象:

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///inquestion.db'
db = SQLAlchemy(app)


我继续创建三个表:GenreAlbumArtist
由于Artist可以链接到多个Albums,并且Albums可以包含多个Artists,因此我需要多对多属性,因此将有第四个表用于将Artist存储到Album id:

albums_to_artists_table = db.Table('albums_to_artists_table',
                          db.Column('album_id', db.Integer, db.ForeignKey('album.id')),
                          db.Column('artist_id', db.Integer, db.ForeignKey('artist.id')))

class Genre(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True)

class Album(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    artists = db.relationship('Artist', backref='album', lazy='dynamic', secondary=albums_to_artists_table)

class Artist(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True)
    genre_id = db.Column(db.Integer, db.ForeignKey('genre.id'))

    _albums = db.relationship('Album', secondary=albums_to_artists_table, backref=db.backref('albums_to_artists_table_backref', lazy='dynamic'))


最后,我创建数据库:

db.drop_all()
db.create_all()

genre = Genre(name='Disco')
db.session.add(genre)
db.session.commit()

album1 = Album(name='Main Course')
album2 = Album(name='Spirits Having Flown')
db.session.add(album1)
db.session.add(album2)
db.session.commit()

artist = Artist(name='Bee Gees', genre_id = genre.id, _albums=[album1, album2])
db.session.add(artist)
db.session.commit()


现在,我可以查询哪些Artists连接到给定的Genre

Artist.query.filter_by(genre_id = genre.id).all()


我还可以查询Albums连接到的Artist

Album.query.filter(Album.artists.any(name='Bee Gees')).all()


但是,如何查询与给定Artists连接的Genre是什么?换句话说,我想用给定的Artists收集链接到Genre的所有genre.id吗?

最佳答案

但是,如何查询与给定类型相关的艺术家?换句话说,我想收集与具有给定genre.id的流派链接的所有Artists?


您在问题中举了一个例子来说明如何做到这一点,请通过Artist获取Genre。我认为您真正要问的是如何通过Album来获得Genre,对吗?如果是这样,请尝试以下操作:

Album.query.join(Artist).join(Genre).filter(Genre.id==YOUR_GENRE_ID).all()

关于python - 如何使用Flask SQLAlchemy查询多对多,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40698437/

10-13 08:54