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 中提取对象。我该怎么做?
您可以做的是:
当par3
是queryset1
相同类型的relation
时:
queryset2 = ModelB.objects.all().filter(par3__in=queryset1, par4="Z")
当 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 ...)
所以我有 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 中提取对象。我该怎么做?
您可以做的是:
当
par3
是queryset1
相同类型的relation
时:queryset2 = ModelB.objects.all().filter(par3__in=queryset1, par4="Z")
当
时,使用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 ...)