Django: 扩展查询集 / 使用 OR 连接多个过滤器
我有一个查询集(queryset),已经进行了过滤,比如说:qs = queryset.filter(language='de')。但在后续的操作中,我需要撤销一些已经应用的过滤条件,比如说不只取语言为' de'的行,而是取所有语言的条目。有没有办法再次应用过滤,并把新的条件和已有的条件用“或”连接起来,而不是简单地添加?比如说,如果查询集已经过滤了语言为'de',我想把'或语言为'en'的条件加进去,这样就能得到我想要的结果!谢谢!
1 个回答
3
我觉得你想做的事情是不可能的。
在Django中,做“或”操作的方法是这样的:
Model.objects.filter(Q(question__startswith='Who') | Q(question__startswith='What'))
所以如果你真的想这样做:
Model.objects.filter(Q(language='de') | Q(language='en'))
你需要把它们放在同一个filter()调用中,这样你就不能在后面的filter()调用中再添加其他的“或”条件了。
我想你可能想这样做是因为你担心再次访问数据库,但要得到准确的结果,唯一的方法就是再次访问数据库。
如果你只是想写出干净、简洁的代码,你可以把两个查询中共同的过滤条件放在最上面,然后再“分叉”这个查询集,像这样:
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'))