使用来自另一个QuerySet的查询过滤django QuerySet:可能吗?

dmr*_*non 9 django django-models

假设我创建一个QuerySet,如:

q0  = Thing.objects.all()
fq0 = q0.filter(x=y)
Run Code Online (Sandbox Code Playgroud)

在时间t0.然后我给Thing db添加了一些新东西.这些东西组成了QuerySet:

q1 = Thing.objects.filter(created_gt=t0)
Run Code Online (Sandbox Code Playgroud)

我想生成QuerySet:

fq = (q0 | q1).filter(x=y)
Run Code Online (Sandbox Code Playgroud)

无需知道x或y是什么.换句话说,我希望能够做到这样的事情:

fq1 = q1.filter(query=fq0.query)
fq = fq0 | fq1
Run Code Online (Sandbox Code Playgroud)

这可能吗?手动设定

q1.query = fq0.query
Run Code Online (Sandbox Code Playgroud)

只是设定q1 == fq0.我见过有人问过从查询集中提取sql,但这对我没有帮助.

zza*_*art 18

这些方面的内容怎么样:

Thing.objects.filter(field__in=Another_queryset.object.filter())

Django将执行查询和子查询.

  • 我认为您的意思是“Another_model.objects.filter()”或只是“another_queryset”。 (4认同)

Eva*_*ley 0

据我通过查看 QuerySet 和 Query 模块可知,Django 不会保存发送到查询集中的参数的运行记录。它将所有内容直接转换为较低级别的查询片段,然后丢弃您给它的标记。因此,在没有先验知识的情况下弄清楚查询集是如何被过滤的是一项不简单的任务。

您可以通过将如下内容组合在一起来手动完成此操作:

q0 = Thing.objects.all()
filter_kwargs = {'x': y}
fq0 = q0.filter(**filter_kwargs)
fq0.saved_filter_kwargs = filter_kwargs

##### snip #####

fq1 = q1.filter(**fq0.saved_kwargs)
Run Code Online (Sandbox Code Playgroud)

虽然有点恶心。尝试以不同的方式解决这个问题可能会更好。我建议您发布另一个问题,并包括您想要在大局中实现的目标,我们也许能够帮助您提出更好的架构。