python web-django之ORM多条件查询Q

前言

django自带的ORM功能很强大,提供多种查询数据的方式。filter 等方法中的关键字参数查询都是一起进行“AND” 的。 如果你需要执行更复杂的查询(例如OR 语句),可以使用Q对象。

python web-django之ORM多条件查询Q


使用

1、导入Q对象

from django.db.model import Q

Q 对象可以使用c&(AND)和|(OR)操作符组合起来。

当一个操作符在两个Q 对象上使用时,它产生一个新的Q 对象。

2、例子

Q(question__startswith='Who') | Q(question__startswith='What')

等同于SQL语句

WHERE question LIKE 'Who%' OR question LIKE 'What%'

3、如果一个查询函数有多个Q 对象参数(逗号隔开的),这些参数的逻辑关系为“AND"。

Poll.objects.get(

Q(question__startswith='Who'),

Q(pub_date=date(2018, 5, 29)) | Q(pub_date=date(2018, 5, 30))

)

#等同于下列SQL语句:

SELECT * from polls WHERE question LIKE 'Who%'

AND (pub_date = '2018-05-29' OR pub_date = '2018-05-30')

4、Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询:

Q(question__startswith='Who') | ~Q(pub_date__year=2017)

5、查询函数可以混合使用Q对象和关键字参数。所有提供给查询函数的参数(关键字参数或Q 对象)都将"AND”在一起。但是,如果出现Q 对象,它必须位于所有关键字参数的前面。例如

Poll.objects.get(

Q(pub_date=date(2018, 5, 29)) | Q(pub_date=date(2018, 5, 30))

question__startswith='Who'

#下列是不合法的查询条件

Poll.objects.get(

question__startswith='Who',

Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))


总结

django可以快速完成任务!人生苦短,我用Python!

python web-django之ORM多条件查询Q


分享到:


相關文章: