Expressions de requête spécifiques à PostgreSQL¶
Ces expressions sont disponibles dans le module django.contrib.postgres.expressions
.
Expressions ArraySubquery()
¶
-
class
ArraySubquery
(queryset)¶
ArraySubquery
est une sous-requête Subquery
qui utilise le constructeur PostgreSQL ARRAY
pour construire une liste de valeurs du jeu de requêtem qui doit utiliser QuerySet.values()
pour ne renvoyer qu’une seule colonne.
Cette classe diffère de ArrayAgg
dans le sens où elle n’agit pas comme une fonction d’agrégat et n’exige pas de clause SQL GROUP BY
pour construire la liste des valeurs.
Par exemple, si vous souhaitez annoter tous les livres liés à un auteur sous forme d’objet JSON :
>>> from django.db.models import OuterRef
>>> from django.db.models.functions import JSONObject
>>> from django.contrib.postgres.expressions import ArraySubquery
>>> books = Book.objects.filter(author=OuterRef("pk")).values(
... json=JSONObject(title="title", pages="pages")
... )
>>> author = Author.objects.annotate(books=ArraySubquery(books)).first()
>>> author.books
[{'title': 'Solaris', 'pages': 204}, {'title': 'The Cyberiad', 'pages': 295}]