可以在使用Subquery() expressions Django的1.11或更高版本。
from django.db.models import OuterRef, Subquery
code_subquery = A.objects.filter(id=OuterRef('code'))
qs = D.objects.annotate(code_name=Subquery(code_subquery.values('name')))
的qs
的輸出是具有添加的字段code_name
對象D
的查詢集。
腳註:
它編譯成一個非常類似的SQL(像熊布朗與「額外」的方法解決方案,但沒有他的解決方案的缺點,看到那裏):
SELECT app_d.id, app_d.code,
(SELECT U0.name FROM app_a U0 WHERE U0.id = (app_d.code)) AS code_name
FROM app_d
如果需要字典輸出,最終可以通過.values()
進行轉換。它可以像左連接一樣工作,即如果僞相關字段允許爲空(code = models.IntegerField(none=True)
),則對象D不受限制,並且輸出code_name值可以爲無。子查詢的一個特性是它只返回一個字段表達式,必須最終重複其他字段。 (這類似於extra(select={...: "SELECT ..."})
,但由於對象語法它可以比一個明確的SQL更具可讀性定製)。
代碼字段可以有許多存在於模型A - 你是什麼意思?模型A中的代碼== pk? –
@BearBrown是的,它認爲存在於模型號碼A –