【Django】执行查询——Q对象

本文介绍了如何在DjangoORM中使用Q对象处理复杂的查询条件,如AND和OR逻辑,以及Q对象在filter(),exclude()等函数中的使用规则,强调了Q对象与关键字参数的正确组合方式。
摘要由CSDN通过智能技术生成

filter()exclude()等当中,如果有多个关键字参数,那他们在SQL的查询逻辑中是AND的关系。现实中有时候我们查询的逻辑并不是简单的A字段=某值,B字段__startwith=某值,如果我们要使用OR等的逻辑,就要使用Q对象

Q 对象可以使用 &|^ 运算符组合。当在两个 Q 对象上使用运算符时,它会产生一个新的 Q 对象。此外,可以使用 ~ 运算符对 Q 对象进行取反。

每个接受关键字参数的查询函数 (例如 filter()exclude()get()) 也同时接受一个或多个 Q 对象作为位置(未命名的)参数。若你为查询函数提供了多个 Q 对象参数,这些参数会通过 AND 的查询逻辑连接。

例子:

Poll.objects.get(
    Q(question__startswith="Who"),
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
)

对应的SQL查询语句:

SELECT * from polls WHERE question LIKE 'Who%'
    AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')

查询函数能混合使用 Q 对象和关键字参数。所有提供给查询函数的参数(即关键字参数或 Q 对象)均通过 “AND” 连接。然而,若提供了 Q 对象,那么它必须位于所有关键字参数之前。例子:

# 可行的查询方式
Poll.objects.get(
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
    question__startswith="Who",
)

# 不可行的查询方式
# INVALID QUERY
Poll.objects.get(
    question__startswith="Who",
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个甜甜的大橙子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值