Vous pouvez utiliser Subquery() expressions dans Django 1.11 ou plus récent.
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')))
La sortie de qs
est un queryset d'objets D
avec un champ ajouté code_name
.
Notes:
Il est compilé à un SQL très similaire (comme la solution de l'ours brun avec la méthode "extra", mais sans les inconvénients de sa solution, voir là):
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
Si une sortie de dictionnaire est requise, elle peut être convertie par .values()
enfin. Il peut fonctionner comme une jointure gauche, c'est-à-dire si le pseudo-champ associé autorise null (code = models.IntegerField(none=True)
) alors les objets D ne sont pas restreints et la valeur de nom_de_codes de sortie peut être None. Une caractéristique de Subquery est qu'il retourne une seule expression de champ doit être finalement répété pour d'autres champs. (Cela est similaire à extra(select={...: "SELECT ..."})
, mais grâce à la syntaxe de l'objet, il peut être plus facile à lire qu'un SQL explicite.)
Le champ de code peut avoir un nombre qui existe dans le modèle A - que voulez-vous dire? code == pk dans le modèle A? –
@BearBrown Oui, il contient un nombre qui existe dans le modèle A –