2011-12-02 136 views
7

说我创建这样一个QuerySet:在t0时刻使用来自另一个QuerySet的查询过滤django QuerySet:可能吗?

q0 = Thing.objects.all() 
fq0 = q0.filter(x=y) 

。然后我给Thing db添加一些新的东西。这些东西形成查询集:

q1 = Thing.objects.filter(created_gt=t0) 

我要生成的查询集:

fq = (q0 | q1).filter(x=y) 

而不必知道什么X或Y的。换句话说,我希望能够做这样的事情:

fq1 = q1.filter(query=fq0.query) 
fq = fq0 | fq1 

这可能吗?手动设置

q1.query = fq0.query 

只是设置q1 == fq0。我见过一些人询问从查询集中提取sql,但这对我没有任何帮助。

回答

1

据我所知,通过查看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) 

类虽然。尝试以不同的方式解决这个问题可能更好。我建议你发布另外一个问题,包括你试图在大局中实现的目标,并且我们可以帮助你提出一个更好的架构。

+0

大图:缓存fq0,仅通过过滤q1来生成fq。你说得对,这是一个讨厌的解决方案。当你缓存事物时,它变得更加糟糕。幸运的是我找到了更好的解决方案。尽管感谢您的帮助。我喜欢你,但我需要更多的代表。 –

+0

@dmrparthenon你应该回答你的问题与你发现的解决方案,以帮助社区和标记为已解决回答自己的答案。 –

12

如何沿着这些路线的东西:

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

Django会做查询和子查询。