Django:在查询集中循环查询集

Django: Loop Queryset inside Queryset

所以我有 queryset1,它通过 2 个参数过滤 ModelA:

queryset1 = ModelA.objects.all().filter(par1="X",par2="Y")

然后我有另一个 queryset2,我想通过获取已被 queryset1 过滤的元素以及跟随另一个参数的元素来过滤 ModelB:

queryset2 = ModelB.objects.all().filter(par3="X" for i in queryset,par4="Z")

我的问题是: 有没有办法在您已经创建的查询集上执行查询集? 最后,我想从 par1 par2 par3 之后的 ModelA 和 ModelB 中提取对象。我该怎么做?

您可以做的是:

  1. par3queryset1相同类型的relation时:

    queryset2 = ModelB.objects.all().filter(par3__in=queryset1, par4="Z")
    
  2. part3 不是 relation

    时,使用 values_list('some_field', flat=True) 表示法
    queryset2 = ModelB.objects.all().filter(par3__in=queryset1.values_list('X', flat=True), par4="Z")
    

不用for循环也能实现。使用 for 循环的缺点是您实际上是在执行两个查询并检索第一个查询的结果。如果发生这种情况会产生大量行,您将耗尽资源并减慢响应时间。

queryset2 = ModelB.objects.all().filter(par3__in=queryset,par4="Z")

这将导致子查询,如 https://docs.djangoproject.com/en/1.9/ref/models/querysets/

中所述

You can also use a queryset to dynamically evaluate the list of values instead of providing a list of literal values:

SELECT * FROM app_modelb where par3 IN (SELECT ...)