【问题标题】:Django: serialize an annotated and aggregated queryset to GeoJSONDjango:将带注释和聚合的查询集序列化为 GeoJSON
【发布时间】:2020-09-08 07:54:57
【问题描述】:

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

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

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

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)

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'

即使 serialize 步骤有效,我怀疑它会跳过我带注释的字段(通过阅读其他帖子)

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

【问题讨论】:

  • ValuesQuerysetlist 类对象,而不是 dict 类对象
  • 我刚刚编辑了答案并删除了对 ValuesQueryset 的引用。我刚刚注意到它实际上是一个 Queryset 对象。但是AttributeError: 'dict' object has no attribute '_meta' 是什么意思?如何将我的查询集序列化为 GeoJSON?
  • serialize 来自哪里?您能否创建一个最小可重现示例
  • 当然。我刚刚编辑了问题并添加了一些代码。

标签: django django-views django-orm geodjango


【解决方案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})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 2018-06-15
    • 2020-05-23
    • 2023-03-29
    • 2017-07-21
    • 2019-05-14
    • 2020-05-14
    • 2015-11-02
    相关资源
    最近更新 更多