PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment écrire une requête Django avec une sous-requête dans le cadre de la clause WHERE ?

Sous-requêtes doivent être des requêtes qui ne sont pas immédiatement évaluées afin que leur évaluation puisse être reportée jusqu'à ce que la requête externe soit exécutée. get() ne correspond pas à la facture car il est exécuté immédiatement et renvoie une instance d'objet plutôt qu'un Queryset .

Cependant, en remplaçant filter pour get puis en prenant un [:1] slice devrait fonctionner :

StatByHour.objects.filter(hour_of_day=OuterRef('hour_filter')).values('hour_of_day')[:1]

Notez comment la référence de champ dans OuterRef est un littéral de chaîne plutôt qu'une variable.

De plus, les sous-requêtes doivent renvoyer une seule colonne et une seule ligne (car elles sont affectées à un seul champ), d'où le values() et le découpage ci-dessus.

De plus, je n'ai pas utilisé de sous-requête dans un Q objet encore; Je ne suis pas sûr que cela fonctionnera. Vous devrez peut-être d'abord enregistrer la sortie de la sous-requête dans une annotation, puis l'utiliser pour vos calculs de filtre.