#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(),
)
)