使用 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 的同意。