Django - 在查询中排除两个条件

时间:2014-09-01 09:44:28

标签: python mysql django

最好的方法是什么?

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')

我试图排除没有状态和状态的对象"删除"。我可以一次订购吗?如果不是最好的方式?

我是Django的新人。

谢谢

4 个答案:

答案 0 :(得分:13)

了解Q Objects
您的查询将是:

from django.db.models import Q
Object.objects.filter(country_send=country).exclude(Q(status__exact='') | Q(status__exact='deleted')).order_by('-id')

答案 1 :(得分:12)

您可以尝试使用“列表”。在状态列表中,您可以添加所需的所有单词。

status = ['deleted', '']
Object.objects.filter(country_send=country).exclude(status__in=status).order_by('-id')

有关列表的更多信息:http://www.sthurlow.com/python/lesson06/

答案 2 :(得分:1)

您可以考虑将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,并排除由Joe( OR )于2018年发布的作者所写的内容。

答案 3 :(得分:1)

您可以使用Q

from django.db.models import Q
Model.objects.filter(country_send=country, ~Q(status__in=['deleted', ''])).order_by('-id')