PostgreSQL 特有查询表达式

这些表达式可以从 django.contrib.postgres.expressions 模块中获得。

ArraySubquery() 表达式

class ArraySubquery(queryset)

New in Django 4.0.

ArraySubquery 是一个 Subquery,使用 PostgreSQL 的 ARRAY 构造函数,从查询集中建立一个值列表,它必须使用 QuerySet.values() 来只返回一个列。

这个类与 ArrayAgg 不同,它不作为一个聚合函数,也不需要一个 SQL GROUP BY 子句来建立值的列表。

例如,如果你想把一个作者的所有相关书籍注释为 JSON 对象:

  1. >>> from django.db.models import OuterRef
  2. >>> from django.db.models.functions import JSONObject
  3. >>> from django.contrib.postgres.expressions import ArraySubquery
  4. >>> books = Book.objects.filter(author=OuterRef('pk')).values(
  5. ... json=JSONObject(title='title', pages='pages')
  6. ... )
  7. >>> author = Author.objects.annotate(books=ArraySubquery(books)).first()
  8. >>> author.books
  9. [{'title': 'Solaris', 'pages': 204}, {'title': 'The Cyberiad', 'pages': 295}]