Python 如何在django queryset中执行或调节?

Python 如何在django queryset中执行或调节?,python,sql,django,django-queryset,django-orm,Python,Sql,Django,Django Queryset,Django Orm,我想编写一个与此SQL查询等效的Django查询: SELECT * from user where income >= 5000 or income is NULL. 如何构造Django queryset过滤器 User.objects.filter(income__gte=5000, income=0) 这不起作用,因为它会关闭过滤器。我想或过滤器以获得单个查询集的并集 from django.db.models import Q User.objects.filter(Q(in

我想编写一个与此SQL查询等效的Django查询:

SELECT * from user where income >= 5000 or income is NULL.
如何构造Django queryset过滤器

User.objects.filter(income__gte=5000, income=0)
这不起作用,因为它会关闭过滤器。我想
过滤器以获得单个查询集的并集

from django.db.models import Q
User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True))

因为Python
\uuuuu或uuuu
操作符(
)或union,所以它可以正常工作。正如您所期望的那样,
二进制运算符返回一个
查询集
,因此
order\u 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.db.models导入Q
q1=User.objects.filter(Q(income_ugte=5000)| Q(income_uisnull=True))

q2=User.objects.filter(income_ugte=5000)| User.objects.filter(income_uisnull=True)
然而,对于选择哪一个似乎有些困惑

关键是它们在SQL级别上是相同的,所以您可以随意选择任何您喜欢的

关于这一点,会谈较为详细,以下是相关部分:


queryset=User.objects.filter(
第一个\u名称\u以='R'开头
)| User.objects.filter(
姓氏以class='D'开头
)
导致

[5]中的
:str(queryset.query)
Out[5]:'选择“auth_user”“id”“auth_user”“password”“auth_user”“last_login”,
“授权用户”“是超级用户”“授权用户”“用户名”“授权用户”“第一名”,
“授权用户”,“姓氏”,“授权用户”,“电子邮件”,“授权用户”,“是工作人员”,
“身份验证用户”“处于活动状态”“身份验证用户”“加入日期”来自“身份验证用户”
其中(“auth_user”。“first_name”::类似于R%的文本或“auth_user”。“last_name”::类似于D%的文本”

qs=User.objects.filter(Q(first_name_ustartswith='R')|Q(last_name_ustartswith='D'))
导致

[9]中的
:str(qs.query)
Out[9]:'选择“auth_user”“id”“auth_user”“password”“auth_user”“last_login”,
“授权用户”“是超级用户”“授权用户”“用户名”“授权用户”“第一名”,
“授权用户”,“姓氏”,“授权用户”,“电子邮件”,“授权用户”,“是工作人员”,
“身份验证用户”“处于活动状态”“身份验证用户”“加入日期”来自“身份验证用户”
其中(“auth_user”。“first_name”::类似于R%的文本或“auth_user”。“last_name”::类似于D%的文本”
资料来源:



如果有人想查看,只需为附加到
Q
对象的多个过滤器添加此选项即可。 如果提供了
Q
对象,则该对象必须位于任何关键字参数的定义之前。否则它将是一个无效的查询。做这件事时你应该小心

例如

from django.db.models import Q
User.objects.filter(Q(income__gte=5000) | Q(income__isnull=True),category='income')

这里考虑了OR条件和带有收入类别的过滤器

“未记录”和“遗产”让我害怕。我认为使用Q对象更安全,如这里接受的答案中所述。仅供参考,order_by()和distinct()可以应用于管道查询集combined@carruthd谢谢我也证实了这一点。是否可以将顺序_by()应用于每个单独的查询集,然后进行组合?这样每个条件的顺序仍然保持不变?例如,组合的_queryset=User.objects.filter(income_ugte=5000)、order_by('income')| User.objects.filter(income_ult=5000)、order_by('-income')?@Oatman:|操作符被记录。请参阅:“一般来说,Q()对象使定义和重用条件成为可能。这允许使用|(OR)和&(and)运算符构造复杂的数据库查询;特别是,不可能在QuerySet中使用或。”我没有检查早期版本的文档,但pipe运算符至少在Django 1.1.4中工作(刚刚尝试过)。如果您添加object.query的打印,这样我们就可以将ORM和查询输出关联起来以熟悉它,这会有所帮助。顺便说一句,很好的例子。使用这种类型的查询还是执行两个单独的查询更好?如果还有其他一些查询以及这个@lakshman可能的重复查询呢