问题:如何在Django queryset中执行OR条件?
我想编写一个与此SQL查询等效的Django查询:
SELECT * from user where income >= 5000 or income is NULL.
如何构造Django queryset过滤器?
User.objects.filter(income__gte=5000, income=0)
这是行不通的,因为它AND
是过滤器。我想要OR
过滤器以获取单个查询集的并集。
回答 0
from django.db.models import Q
User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True))
回答 1
由于QuerySet实现了Python __or__
运算符(|
)或并集,因此它可以正常工作。正如您所期望的,|
二进制运算符返回一个QuerySet
so order_by()
,,.distinct()
其他查询集过滤器可以附加到末尾。
combined_queryset = User.objects.filter(income__gte=5000) | User.objects.filter(income__isnull=True)
ordered_queryset = combined_queryset.order_by('-income')
更新2019-06-20:现在在Django 2.1 QuerySet API参考中已完全记录了该内容。更多历史性讨论可以在DjangoProject票证#21333中找到。
回答 2
现有答案中已经提到了这两种选择:
from django.db.models import Q
q1 = User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True))
和
q2 = User.objects.filter(income__gte=5000) | User.objects.filter(income__isnull=True)
但是,似乎偏爱哪一个。
关键是它们在SQL级别上是相同的,所以请随意选择您喜欢的任何一个!
在Django的ORM食谱在这个比较详细谈到,这里是有关部分:
queryset = User.objects.filter(
first_name__startswith='R'
) | User.objects.filter(
last_name__startswith='D'
)
导致
In [5]: str(queryset.query)
Out[5]: 'SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login",
"auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name",
"auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff",
"auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user"
WHERE ("auth_user"."first_name"::text LIKE R% OR "auth_user"."last_name"::text LIKE D%)'
和
qs = User.objects.filter(Q(first_name__startswith='R') | Q(last_name__startswith='D'))
导致
In [9]: str(qs.query)
Out[9]: 'SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login",
"auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name",
"auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff",
"auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user"
WHERE ("auth_user"."first_name"::text LIKE R% OR "auth_user"."last_name"::text LIKE D%)'
资料来源:django-orm-cookbook
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。