我正在尝试使用geodjango几何字段计算模型的聚合区域,并按其他属性进行分组。我在geoqueryset api reference中找不到相应的功能,而常规Sum aggregate function不适用于此情况。
所以我尝试在查询集上使用“extra”参数,如下所示:
class MyModel(models.Model):
name = models.CharField(max_length = 100)
geom = models.MultiPolygonField()
objects = models.GeoManager()
MyModel.objects.all()\
.extra(select={'area': 'SUM(ST_Area(geom))'})\
.values('area', 'name')
这不起作用,并返回以下编程错误。
column "app_mymodel.name_id" must appear in the GROUP BY clause \
or be used in an aggregate function
我尝试了extra
,values
和annotate
这些字段的几种组合,但无法获得有效的聚合。如果我遗漏了分组参数names
,则会成功返回总区域。
有关如何获取按附加属性分组的几何体区域的任何想法?
答案 0 :(得分:0)
我能够使用.values_list
,.distinct
,.area
和reduce
一起破解某些内容。
values_list(...).distinct()
咒语用于获取唯一name
属性值的列表。
接下来,循环遍历唯一值,使用唯一值过滤模型查询集,然后使用reduce
对过滤后的QuerySet求和。我不得不使用一个循环(即reduce
)来求和,因为area
不是作为数据库中的列存在,而是与更传统的.aggregate(Sum(...))
方法一起使用。
from django.contrib.gis.measure import Area
from data.models import MyGeoModel
distincts = MyGeoModel.objects.order_by('name').distinct('name').values_list('name', flat=True)
for value in distincts:
print reduce(lambda a,x: a+x.calculated_area.sq_ft, MyGeoModel.objects.filter(name=value).area(model_att='calculated_area'), Area(0))