天天看點

django使用Q進行複雜查詢

最近在學習python,使用django架構, 今天想寫一個注冊,需要使用者名和郵箱必須唯一,是以在校驗唯一性的時候需要用Q進行or查詢,找了官網上有關Q的查詢,供大家參考

使用Q 對象進行複雜的查詢¶

filter() 等方法中的關鍵字參數查詢都是一起進行“AND” 的。 如果你需要執行更複雜的查詢(例如OR 語句),你可以使用Q 對象。

Q 對象 (django.db.models.Q) 對象用于封裝一組關鍵字參數。這些關鍵字參數就是上文“字段查詢” 中所提及的那些。

例如,下面的Q 對象封裝一個LIKE 查詢:

from django.db.models import Q
Q(question__startswith='What')
Q 對象可以使用& 和| 操作符組合起來。當一個操作符在兩個Q 對象上使用時,它産生一個新的Q 對象。

例如,下面的語句産生一個Q 對象,表示兩個"question__startswith" 查詢的“OR” :

Q(question__startswith='Who') | Q(question__startswith='What')
它等同于下面的SQL WHERE 子句:

WHERE question LIKE 'Who%' OR question LIKE 'What%'
你可以組合& 和|  操作符以及使用括号進行分組來編寫任意複雜的Q 對象。同時,Q 對象可以使用~ 操作符取反,這允許組合正常的查詢和取反(NOT) 查詢:

Q(question__startswith='Who') | ~Q(pub_date__year=2005)
每個接受關鍵字參數的查詢函數(例如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)))
... 是不合法的。 

使用filter
User.objects.filter(Q(name=username) | Q(email=email))
等同SQL
select * from User where name='username' or email='email'
           

參考位址:https://yiyibooks.cn/xx/django_182/topics/db/queries.html