Django:将带注释的汇总查询集序列化为GeoJSON

问题描述

我正在尝试使用Django ORM(或使用Django的任何其他方式)执行此查询(Postgresql),并将结果以GeoJSON格式发送回前端。 我正在使用Django 2.2.15 @H_404_1@

SELECT string_agg(name,'; '),geom
FROM appname_gis_observation
where sp_order = 'order1'
GROUP BY geom;

模型看起来像这样(models.py)@H_404_1@

from django.db import models
from django.contrib.gis.db import models

class gis_observation(models.Model): 
    name = models.CharField(max_length=100,null=True)
    sp_order = models.CharField(max_length=100,null=True)
    geom = models.MultiPointField(srid=4326)

所以我认为这可以工作(views.py)@H_404_1@

from django.core.serializers import serialize
from .models import *
from django.shortcuts import render
from django.contrib.postgres.aggregates.general import StringAgg

def show_observation(request):
  results = gis_observation.objects.values('geom').filter(sp_order='order1').annotate(newname=StringAgg('name',delimiter='; '))      
  data_geojson = serialize('geojson',results,geometry_field='geom',fields=('newname',))  
  return render(request,"visualize.html",{"obs" : data_geojson})

ORM查询在Django shell中工作正常,但是Django在 serialize 步骤AttributeError: 'dict' object has no attribute '_Meta'中抱怨。@H_404_1@

即使 序列化 步骤有效,我怀疑它也会跳过带注释的字段(通过阅读其他文章)@H_404_1@

显然,我不是唯一遇到相同问题的人,但我找不到解决方案。@H_404_1@

解决方法

这是我想出的解决方案。坦白说,我很乐意接受另一个答案,因此任何提议仍然值得欢迎! 最后,我通过遍历结果集构建了一个Geojson数组。我想我也可以代替游标sql查询,而完全跳过orm api。

        queryset = gis_species_observation.objects.values('geom').filter(sp_order='order1').annotate(name=StringAgg('name',delimiter='; '))
        mydict = []
        results = list(queryset)
        for result in results: 
            rec = {}
            rec["type"] = "Feature"
            rec["geometry"] = json.loads(result["geom"].geojson)            
            rec["properties"] = {"name":result["name"]}
            mydict.append(rec)
        data_geojson = json.dumps(mydict)
        return render(request,"visualize_romania.html",{"mynames" :data_geojson})