Выражения запросов, специфичные для PostgreSQL¶
Эти выражения доступны из модуля django.contrib.postgres.expressions
.
ArraySubquery()
выражения¶
-
class
ArraySubquery
(queryset)[исходный код]¶
ArraySubquery
- это Subquery
, который использует конструктор PostgreSQL ARRAY
для построения списка значений из queryset, который должен использовать QuerySet.values()
для возврата только одного столбца.
Этот класс отличается от ArrayAgg
тем, что он не действует как агрегатная функция и не требует предложения SQL GROUP BY
для построения списка значений.
Например, если вы хотите аннотировать все связанные с автором книги в виде 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}]