使用 Q 物件進行高階查詢
鑑於模型:
class MyModel(models.Model):
name = models.CharField(max_length=10)
model_num = models.IntegerField()
flag = models.NullBooleanField(default=False)
我們可以使用 Q
物件在查詢查詢中建立 AND
,OR
條件。例如,假設我們想要所有具有 flag=True
OR model_num>15
的物件。
from django.db.models import Q
MyModel.objects.filter(Q(flag=True) | Q(model_num__gt=15))
上面翻譯為 WHERE flag=True OR model_num > 15
類似於你會做的 AND 。
MyModel.objects.filter(Q(flag=True) & Q(model_num__gt=15))
Q
物件也允許我們使用~
進行 NOT 查詢。假設我們想要獲得所有具有 flag=False
和 model_num!=15
的物件,我們會這樣做:
MyModel.objects.filter(Q(flag=True) & ~Q(model_num=15))
如果在 filter()
中使用 Q 物件和普通引數,那麼 Q
物件必須首先出現。以下查詢搜尋具有(flag
設定為 True
或型號大於 15
)和名稱以 H
開頭的模型。
from django.db.models import Q
MyModel.objects.filter(Q(flag=True) | Q(model_num__gt=15), name__startswith="H")
注意: Q
物件可以與任何帶有關鍵字引數的查詢函式一起使用,例如 filter
,exclude
,get
。確保當你使用 get
時,你將只返回一個物件,否則會引發 MultipleObjectsReturned
異常。