Jak*_*way 3 python sqlalchemy flask-sqlalchemy
我有一些像这样的表:
class Genre(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), index=True)
artist_id = db.Column(db.Integer, db.ForeignKey('artist.id'))
class Song(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), index=True)
artist = db.relationship('Artist', uselist=False)
artist_id = db.Column(db.Integer, db.ForeignKey('artist.id'))
class Artist(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), index=True)
genres = db.relationship('Genre')
songs = db.relationship('Song')
Run Code Online (Sandbox Code Playgroud)
所以基本上,歌曲有一个艺术家.每位艺术家都可以拥有多种类型.
我试图通过任何艺术家获得所有歌曲,其中的类型列表包含一个特定名称的类型.我做了一些研究,我发现了一些非常接近的东西:
Song.query.filter(Artist.genres.any(Genre.name.in_([genre_name_im_looking_for])))
Run Code Online (Sandbox Code Playgroud)
这将是一种工作,但并非适用于所有情况.例如,上述声明还将返回所有拥有流派'独立摇滚'的艺术家的歌曲.如何指定我不希望类型名称位于值列表中,而是指定为特定值?
Song.query.filter(Artist.genres.any(Genre.name='rock'))
Run Code Online (Sandbox Code Playgroud)
也不可能,因为它是一个关键字表达式.
有任何想法吗?
有了这个测试数据:
# Test Data
artists = [
Artist(
name='should match rock',
genres=[Genre(name='rock'), Genre(name='pop')],
songs=[Song(name='love'), Song(name='hate')]
),
Artist(
name='should NOT match',
genres=[Genre(name='indie rock')],
songs=[Song(name='elsewhere')]
),
]
db.session.add_all(artists)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)
下面的查询应该做你想要的:
q = Song.query.filter(Song.artist.has(Artist.genres.any(Genre.name == 'rock')))
assert len(q.all()) == 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5274 次 |
| 最近记录: |