我有以下型号(仅作为例子):
class Song(models.Model):
name = CharField()
album = ForeignKey(Album, related_name='songs')
class Album(models.Model):
name = CharField()
genre = ForeignKey(Genre, related_name ='albums')
class Genre(models.Model):
name = CharField()
我正在寻找一种方法来获取与特定(已过滤)流派或流派相关的所有相关歌曲,同时在数据库中进行连接而不是“在内存中”。
我知道我可以使用select_related
条款走另一条路(在good example for this blog post之后:
songs = Song.objects.select_related("album").select_related('genre').all()
并且查询集已经包含了歌曲专辑中的所有流派属性,而没有再次访问数据库。
我的问题是如何反过来:从特定(或过滤)类型开始并获取所有歌曲-d拥有外键链。
答案 0 :(得分:0)
将
Song.objects.select_related( “专辑”)。过滤器(album__genre = GENRE_YOU_WANT)
你想要什么?对于普通外键,应该只使用一个查询。
答案 1 :(得分:0)
您可以使用过滤器获取与流派相关的所有歌曲:
genre = Genre.objects.get(name='pop')
songs_in_genre = Songs.objects.filter(album__genre=genre)
答案 2 :(得分:0)
如果您想立即获取相册及其所有相关歌曲,请使用prefetch_related
:
albums = Album.objects.filter(genre="rock").prefetch_related('songs')