使用 Q 物件進行高階查詢

鑑於模型:

class MyModel(models.Model):
    name = models.CharField(max_length=10)
    model_num = models.IntegerField()
    flag = models.NullBooleanField(default=False)

我們可以使用 Q 物件在查詢查詢中建立 ANDOR 條件。例如,假設我們想要所有具有 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 物件可以與任何帶有關鍵字引數的查詢函式一起使用,例如 filterexcludeget。確保當你使用 get 時,你將只返回一個物件,否則會引發 MultipleObjectsReturned 異常。