繁体   English   中英

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

[英]Using django select_related with an additional filter

我试图找到一种执行查询的最佳方法,但是让自己对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文档中指出的那点很警惕:

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

我不知道这在这里是否适用(因为我使用的是select_related),但是阅读它似乎使我在执行过滤器后就失去了通过select_related获得的任何东西。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM