Django - 从反向模型中选择相关对象 - 例如反向select_related

时间:2014-03-19 21:55:08

标签: django django-orm

我有以下型号(仅作为例子):

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拥有外键链。

3 个答案:

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