【发布时间】:2016-01-15 05:10:22
【问题描述】:
我有一些这样的表:
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])))
这会起作用,但并非适用于所有情况。例如,上述语句还将返回所有具有“独立摇滚”流派的艺术家的歌曲。如何指定我不希望流派名称出现在值列表中,而是作为特定值?
Song.query.filter(Artist.genres.any(Genre.name='rock'))
也是不可能的,因为它是一个关键字表达式。
有什么想法吗?
【问题讨论】:
-
不应该是
Song.query.filter(Artist.genres.any(Genre.name == 'rock'))吗? (比较而不是赋值) -
@Wash 是对的,但即使
in_(['rock'])也不应该真正匹配indie rock。也许你的Artist有rock和indie rock两种类型。 -
@van 是的,我认为它也不应该匹配。我检查了我的数据库......艺术家没有摇滚,但有很多名称中带有“摇滚”的流派,比如“独立摇滚”。仍然困惑为什么它匹配。
-
@Wash 谢谢,我稍后再试。通常你可以使用一个表达式,比如 Artist.query.filter_by(name='whatever'),所以我什至没有考虑使用比较。这个 sqlalchemy 业务还是新手。
-
@van,我尝试了您的查询,但我仍然收到在他们的流派列表中包含“独立摇滚”但没有“摇滚”的艺术家。而且我检查了艺术家没有两种类型。
标签: python sqlalchemy flask-sqlalchemy