使用 F 物件進行高階查詢

F() 物件表示模型欄位或帶註釋的列的值。它可以引用模型欄位值並使用它們執行資料庫操作,而無需將它們從資料庫中拉出到 Python 記憶體中。 - F() 表示式

只要需要在查詢中引用另一個欄位的值,就可以使用 F() 物件。就其本身而言,F() 物件並不意味著什麼,並且它們不能也不應該在查詢集之外呼叫。它們用於在同一查詢集上引用欄位的值。

例如,給定一個模型……

SomeModel(models.Model):
    ...
    some_field = models.IntegerField()

…使用者可以通過參考 id 欄位的值來查詢 some_field 值為 id 的兩倍的物件,同時使用 F() 進行過濾,如下所示:

SomeModel.objects.filter(some_field=F('id') * 2)

F('id') 只是引用同一個例項的 id 值。Django 使用它來建立相應的 SQL 語句。在這種情況下,一些非常類似於此:

SELECT * FROM some_app_some_model 
WHERE some_field = ((id * 2))

如果沒有 F() 表示式,這將通過原始 SQL 或 Python 中的過濾來實現(這會降低效能,尤其是在有大量物件時)。

參考文獻:

F() 類定義:

能夠解析對現有查詢物件的引用的物件。 - F 源

注意:此示例來自上面列出的答案,並得到 TinyInstance 的同意。