小编Fot*_* Sk的帖子

链外键上的Django select_related

我在这里阅读了文档和所有相关问题,但我还没有正确理解select_related在链接/多个外键上的行为。

假设我们有以下模型:

class RecordLabel(models.Model):
   title = models.CharField(...)

class Band(models.Model):
   band_name = models.CharField(...)

class Artist(models.Model):
   record_label = models.ForeignKey(RecordLabel,...)
   belongs_to_band = models.ForeignKey(Band, ...)

class Producer(models.Model):
   customer = models.ForeignKey(Artist, ...)
Run Code Online (Sandbox Code Playgroud)

A.我们将如何在 a 中使用 select_related

Producer.objects.filter(...).select_related(?)
Run Code Online (Sandbox Code Playgroud)

查询以便预加载所有内容?会不会是这样:

Producer.objects.filter(...).select_related(
    'customer__record_label', 'customer__belongs_to_band')
Run Code Online (Sandbox Code Playgroud)

为什么?

B.如果班级有“流派”作为外键,

 class Genre(models.Model):
       genre_name = models.CharField(...)        

 class Band(models.Model):
       band_name = models.CharField(...)
       music_genre = models.ForeignKey(Genres, ...)
Run Code Online (Sandbox Code Playgroud)

然后为了预加载所有内容,我们将执行以下操作:

Producer.objects.filter(...).select_related(
    'customer__record_label__music_genre', 'customer__record_label__band_name',
    'customer__belongs_to_band__music_genre', 'customer__belongs_to_band__music_genre') 
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

Producer.objects.filter(...).select_related(
    'customer__record_label__music_genre', 'customer__record_label__band_name',
    'customer__belongs_to_band', 'customer__belongs_to_band') 
Run Code Online (Sandbox Code Playgroud)

django django-queryset django-select-related

9
推荐指数
1
解决办法
4111
查看次数