3

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

4

1 回答 1

3

我不相信有可能做你所要求的。

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

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

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

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

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

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

如果您只是关心生成干净、干燥的代码,则可以将两个查询共有的所有过滤器放在顶部,然后稍后“分叉”该查询集,如下所示:

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'))
于 2009-10-29T19:19:06.640 回答