Django中按组分组的geoqueryset的聚合区域

时间:2014-02-05 18:31:11

标签: python django aggregate-functions geodjango django-queryset

我正在尝试使用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

我尝试了extravaluesannotate这些字段的几种组合,但无法获得有效的聚合。如果我遗漏了分组参数names,则会成功返回总区域。

有关如何获取按附加属性分组的几何体区域的任何想法?

1 个答案:

答案 0 :(得分:0)

我能够使用.values_list.distinct.areareduce一起破解某些内容。

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))