gpt4 book ai didi

python - SQLAlchemy:过滤多对一关系,其中一个对象具有包含特定值的列表

转载 作者:太空宇宙 更新时间:2023-11-03 12:57:35 26 4
gpt4 key购买 nike

我有一些这样的表:

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')

所以基本上,歌曲有一个艺术家。每个艺术家都可以有多个流派。

我正在尝试获取任何艺术家的所有歌曲,这些艺术家的流派列表包含特定名称的流派。我做了一些研究,发现了一些非常接近的东西:

Song.query.filter(Artist.genres.any(Genre.name.in_([genre_name_im_looking_for])))

这会起作用,但并非适用于所有情况。例如,上面的语句还将返回流派为“indie rock”的艺术家的所有歌曲。如何指定我不希望 Genre 名称出现在值列表中,而是成为特定值?

Song.query.filter(Artist.genres.any(Genre.name='rock'))

也是不可能的,因为它是关键字表达式。

有什么想法吗?

最佳答案

有了这个测试数据:

# 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()

下面的查询应该做你想做的:

q = Song.query.filter(Song.artist.has(Artist.genres.any(Genre.name == 'rock')))
assert len(q.all()) == 2

关于python - SQLAlchemy:过滤多对一关系,其中一个对象具有包含特定值的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34804756/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com