Django:使用OR扩展Querysets /连接多个过滤器

时间:2009-10-29 18:46:35

标签: python django filter django-queryset

我必须使用已经过滤的查询集,例如。 qs = queryset.filter(language ='de')但在某些进一步的操作中,我需要撤消一些已经应用的过滤,例如,不要只使用language ='de'的行,而是使用所有语言的条目。有没有办法再次应用过滤器,并使用OR不添加新的参数连接到已存在的过滤器,例如。如果已经为language ='de'过滤了查询集,并且我能够将'OR language ='en'连接到那个,它会给我我正在寻找的东西! 谢谢!

1 个答案:

答案 0 :(得分:2)

我认为不可能做你要求的事。

你在django中做OR的方式是这样的:

Model.objects.filter(Q(question__startswith='Who') | Q(question__startswith='What'))

所以如果你真的想这样做:

Model.objects.filter(Q(language='de') | Q(language='en'))

你需要将它们放在同一个filter()调用中,这样你就无法在稍后的filter()调用中添加另一个或子句。

我认为您可能尝试这样做的原因是您担心再次访问数据库,但获得准确结果的唯一方法是再次访问数据库。

如果你只是担心产生干净的DRY代码,你可以将两个查询共有的所有过滤器放在顶部,然后“分叉”后面的查询集,如下所示:

shared_qs = Model.objects.filter(active=True)
german_entries = shared_qs.filter(language='de')
german_and_english = shared_qs.filter(Q(language='de') | Q(language='en'))