Django的GeoJSON序列化器没有序列化所有字段?

时间:2015-06-15 11:34:44

标签: python django geojson

我使用Django 1.8,使用GeoDjango和PostGIS。我正在使用HttpResponse返回一些GeoJSON:

from django.http import HttpResponse, JsonResponse
code = request.GET.get('q', '')
results = PCT.objects.filter(Q(code__startswith=code) |
                                 Q(name__icontains=code))
results = results.filter(org_type='CCG')
for result in results:
    print result.code
geo_field = 'boundary'
fields = ('name', 'code', 'ons_code', 'org_type', 'boundary', )
return HttpResponse(serialize('geojson', results,
                    geometry_field=geo_field, fields=fields),
                    content_type='application/json')

在控制台中打印code字段就好了:

99N

但返回的GeoJSON没有properties.code字段。它有一个properties.nameproperties.org_typeproperties.ons_code字段。

enter image description here

这是为什么? code也许是一个保留的名字吗?如果是这样,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

我已经快速浏览了GeoJSON规范,看起来它只能说属性字段本身就是一个JSON对象,所以我想你在如果你想在JSON转储的那一部分中使用当前规范。也就是说,这个规范仍处于草案形式,因此可能会发生变化(并且可能会对此字段施加额外的限制)。假设你可以忍受,我们可以继续......

处理此问题的代码位于geojson序列化程序中。目前,这只会为get_dump_object()中的几何,类型和属性字段创建数据。但是你会注意到属性字段呈现self._current中的任何内容。当串行器迭代对象中的其余字段时,该字段实际上是由父类的方法构建的。

在调用get_dump_object()时,self._current应包含对象中的所有其他可序列化字段。正如您在base序列化程序类中看到的那样,只有在使用serialize=True构造字段并且该字段位于您传递给serialize()的指定字段列表中时才会序列化字段(或你没有指定一个过滤器,所以你将获得一切)。因此,我猜您的code字段已被声明为不可序列化,或者它具有与您的过滤器不匹配的意外内部名称。

要尝试修复它,我会查看您的模型中code字段的声明是否为错误的序列化参数,然后只尝试序列化而不包含任何字段列表。希望其中一个人能够将你遗失的领域变成JSON。