如何在Django ORM查询中排除两个条件?
我想知道怎么通过两个条件来排除一些东西,这两个条件是用“或者”连接的:
Object.objects.filter(country_send=country).exclude(status__exact='').order_by('-id')
Object.objects.filter(country_send=country).exclude(status__exact='deleted').order_by('-id')
我想排除掉那些没有状态和状态是“已删除”的对象。
4 个回答
3
你可以通过使用Q来实现这个功能。
from django.db.models import Q
Model.objects.filter(country_send=country, ~Q(status__in=['deleted', ''])).order_by('-id')
14
你可以考虑把多个 exclude
调用连在一起使用:
Object.objects.filter(country_send=country).exclude(status='').exclude(status='deleted').order_by('-id')
这样做的效果就像是使用一个 or
操作符,而且比用 Q()
对象更容易理解。
上面Marcos提到的“列表”方法在你的情况下可能是最好的选择,但我这种方法在你需要对不同字段进行“或”操作时会很有用:
Book.objects.exclude(author='Joe').exclude(publish_year='2018')
这样会返回所有的 Books
,并排除那些要么是乔写的,要么是在2018年出版的书。
30
看看这个链接:Q 对象。
你的查询将会是:
from django.db.models import Q
Object.objects.filter(country_send=country).exclude(Q(status__exact='') | Q(status__exact='deleted')).order_by('-id')
29
你可以试试用“列表”。在状态列表中,你可以添加你想要的所有单词。
status = ['deleted', '']
Object.objects.filter(country_send=country).exclude(status__in=status).order_by('-id')
关于列表的更多信息: http://www.sthurlow.com/python/lesson06/