如何在Django ORM查询中排除两个条件?

26 投票
4 回答
23756 浏览
提问于 2025-04-19 04:37

我想知道怎么通过两个条件来排除一些东西,这两个条件是用“或者”连接的:

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/

撰写回答