Django ORM: как мне применить функцию к совокупному результату?

#django #django-orm

#django #django-orm

Вопрос:

Я хочу сделать

 SELECT [field1], ST_Area(ST_Union(geometry), True) FROM table [group by field1]
  

Или, другими словами, как мне применить функцию к совокупному результату? ST_Union — это совокупность. [field1] — это просто бесплатная запись, в которой говорится, что я хотел бы выполнить оба запроса с этой группой или без нее.

Кроме того, ST_Area с 2 аргументами, похоже, недоступен в помощниках django gis, поэтому его, вероятно, следует записать с использованием Func .

Кроме того, я хочу иметь возможность также агрегировать по всему (не предоставлять groupBy), но django, похоже, добавляет a group by id , если я ничего не предоставляю .values() в набор запросов.

Это кажется очень запутанным. Я не могу разобраться с аннотациями и агрегатами. Спасибо!

Ответ №1:

По-видимому, я обычно могу связывать агрегаты, например

 from django.contrib.gis.db.models import Union, GeometryField
from django.contrib.gis.db.models.functions import Transform, Area

qs = qs.annotate(area_total=Area(Transform(Union("geometry"), 98056)))
  

Проблема, с которой я столкнулся, заключалась в том, что я пытался использовать Func() выражения. Чтобы связать другую функцию в 1-м параметре Func , она должна быть обернута с ExpressionWrapper помощью или чем-то еще.

     qs = qs.annotate(
        area_total=Func(
            ExpressionWrapper(Union("geometry"), output_field=GeometryField()),
            True,
            function="ST_Area",
            output_field=FloatField(),
        )
    )