PostgreSQL 固有のクエリ式¶
これらの式は django.contrib.postgres.expressions
モジュールから利用できます。
ArraySubquery()
式¶
ArraySubquery
は、PostgreSQL の ARRAY
コンストラクタを使用してクエリセットから値のリストを構築する Subquery
です。クエリセットは QuerySet.values()
を使用して、1つの列のみを返す必要があります。
このクラスは、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}]