Django的Q查詢

Complex lookups with Q objects(Q對象的複雜查詢)

僅僅靠單一的關鍵字參數查詢已經很難滿足查詢要求。此時Django爲我們提供了Q查詢:

class Q

1、Q對象(django.db.models.Q)可以對關鍵字參數進行封裝,從而更好地應用多個查詢,下面是最簡單的例子:


from django.db.models import Q
from login.models import New  #假設在我的login app的models.py下有New數據類
q1=New.objects.filter(Q(question__startswith='What'))

2、可以組合使用&,|操作符,當一個操作符是用於兩個Q的對象,它產生一個新的Q對象。

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

3、Q對象可以用~操作符放在前面表示否定,也可允許否定與不否定形式的組合

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

4、應用範圍:

Each lookup function that takes keyword-arguments (e.g. filter()exclude()get()) can also be passed one or more Q objects as positional (not-named) arguments. If you provide multiple Q object arguments to a lookup function, the arguments will be “AND”ed together. For example:

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

... roughly translates into the SQL:

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

5、Q對象可以與關鍵字參數查詢一起使用,不過一定要把Q對象放在關鍵字參數查詢的前面。

正確:
Poll.objects.get(
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
    question__startswith='Who')

錯誤:
Poll.objects.get(
    question__startswith='Who',
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))

轉自:http://www.cnblogs.com/BeginMan/archive/2013/04/17/3026243.html



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章