如何使用Flask SQLAlchemy查询多对多

时间:2016-11-19 22:07:07

标签: python flask sqlalchemy

导入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可以链接到多个AlbumsAlbums可以包含多个Artists,我需要多个属性,因此会有第四个表用于存储ArtistAlbum ids:

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的{​​{1}}相关联的所有Genre

1 个答案:

答案 0 :(得分:1)

  

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

您在问题中举了一个例子来做到这一点,通过Artist获取Genre。我想你实际上要问的是如何通过Album获得Genre,是吗?如果是这样,尝试这样的事情:

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