【问题标题】:Django - selecting the related objects from the reverse model - e.g reverse select_relatedDjango - 从反向模型中选择相关对象 - 例如反向 select_related
【发布时间】:2014-03-19 21:55:07
【问题描述】:

我有以下型号(只是为了举例):

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

【问题讨论】:

    标签: django django-orm


    【解决方案1】:

    Song.objects.select_related("album").filter(album__genre=GENRE_YOU_WANT)

    成为你想要的?对于普通的外键,应该只使用一个查询。

    【讨论】:

      【解决方案2】:

      您可以使用过滤器获取与流派相关的所有歌曲:

      genre = Genre.objects.get(name='pop')
      songs_in_genre = Songs.objects.filter(album__genre=genre)
      

      【讨论】:

        【解决方案3】:

        如果您想一次获取专辑及其所有相关歌曲,请使用prefetch_related

        albums = Album.objects.filter(genre="rock").prefetch_related('songs')
        

        【讨论】:

          猜你喜欢
          • 2016-10-05
          • 2011-12-27
          • 2014-02-06
          • 1970-01-01
          • 2023-03-08
          • 2011-02-27
          • 1970-01-01
          • 1970-01-01
          • 2017-03-17
          相关资源
          最近更新 更多