前言
django自帶的ORM功能很強大,提供多種查詢數據的方式。filter 等方法中的關鍵字參數查詢都是一起進行“AND” 的。 如果你需要執行更復雜的查詢(例如OR 語句),可以使用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!
閱讀更多 linux運維菜 的文章