最近在學習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