结合使用Django select_related和其他过滤器

时间:2018-10-26 09:37:41

标签: django filter django-queryset

我试图找到一种执行查询的最佳方法,但让自己对prefetch_related和select_related用例感到困惑。

我有3个表的外键关系:A->有1个很多B h->作为1个很多C。

class A(models.model):
   ...

class B(models.model):
   a = models.ForeignKey(A)

class C(models.model):
   b = models.ForeignKey(B)
   data = models.TextField(max_length=50)

我正在尝试获取符合条件的A的所有实例(A的实例及其所有子代)的所有C.data的列表,所以我有这样的东西:

qs1 = A.objects.all().filter(Q(id=12345)|Q(parent_id=12345))
qs2 = C.objects.select_related('B__A').filter(B__A__in=qs1)

但是,我对(Prefetch docs所言:

  

表示不同数据库查询的任何后续链接方法   将忽略先前缓存的结果,并使用新的检索数据   数据库查询

我不知道这在这里是否适用(因为我使用的是select_related),但是阅读它似乎使我从选择过滤器中获得的任何东西一经过滤就消失了。

我的两部分查询是否达到最佳状态?据我所知,我认为我不需要预取,尽管我注意到我可以将select_related和prefetch_related换出并得到相同的结果。

1 个答案:

答案 0 :(得分:1)

我认为您的问题是由误解引起的。 select_related(和prefetch_related)是优化,专门用于返回相关模型中的值以及原始查询。 不需要

此外,它们对filter都没有任何影响。不论您是否使用select_related,Django都会自动执行相关的联接和子查询以进行查询。