是否有可能在多个级别上prefetch_related?

时间:2015-01-07 03:54:46

标签: django django-models django-1.7 django-queryset

我只是想知道我是否有三种型号:

class A(models.Model:
  b = models.ForeignKeyField('B')
class B(models.Model):
  c = models.ForeignKeyField('C')
class C(models.Model):
  user = models.ForeignKeyField('auth.User')

我在A:

的列表视图中
foo = A.objects.all().prefetch_related('B')

有没有办法让它预取C(然后是' auth.User')?

我正在使用Django 1.7

感谢您的帮助!

1 个答案:

答案 0 :(得分:9)

你应该可以A.objects.all().prefetch_related('b__c__user')。这将获取所有A,然后查看A中引用的所有不同B对象并获取它们,然后对B - >执行相同操作。 C,然后C - >用户。字段字符串中的双下划线运算符表示“完成此操作” - 在这种情况下,它通过b和c指定用户的路径。请注意,“b”和“c”应为小写,因为您指定的是字段名称,而不是类名。

在性能方面,select_related超过prefetch_related可能会更开心,除非您有特定原因要求您不希望数据库执行连接。