1 回答

TA貢獻1906條經驗 獲得超10個贊
使用 annotate() 方法
好像是不可能的。
當然,這是可能的 ;) 您可以使用子查詢或一些巧妙的條件表達式。假設您想從上次訂單操作中獲取總金額,以下是子查詢示例:
from django.db.models import Subquery, OuterRef
orders = Order.objects.annotate(
total=Subquery( # [1]
OrderOperation.objects \
.filter(order_id=OuterRef("pk")) \ # [2]
.order_by('-id') \ # [3]
.values('total') \ # [4]
[:1] # [5]
)
)
上面代碼的解釋:
我們正在向結果列表添加新字段,稱為
total
taht 將由子查詢填充。您可以Order
將此查詢集中的任何其他模型字段訪問它(在評估它之后,在模型實例中或在過濾和其他注釋中)。您可以從Django 文檔中了解注釋的工作原理。子查詢應該只針對當前訂單的操作調用。
OuterRef
just 將被替換為對結果 SQL 查詢中選定字段的引用。我們想按操作
id
降序排序,因為我們確實想要最新的。如果您的操作中有其他字段需要按順序排序(例如創建日期),請在此處填寫。該子查詢應該只
total
從操作返回值我們只想要一個元素。它是使用切片符號而不是普通索引來獲取的,因為在 django 查詢集上使用索引將立即調用它。切片只是
LIMIT
向 SQL 查詢添加子句,而不調用它,這就是我們想要的。
現在您可以使用:
orders.filter(total__lte=some_value)
只獲取您想要的訂單。您還可以使用該注釋來
添加回答
舉報