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

9

我正在使用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字段。为什么会这样呢?code可能是一个保留名称吗?如果是,我该如何解决?

也许当'code'不存在或没有值时,我在控制台上看到打印的值为'99N'只出现了一次,结果列表是否只有一个对象?我们能看到整个响应吗? - Amr Abdelaziz
1
我认为这是因为“code”不是GeoJSON规范的有效部分或属性,并且无法以序列化形式放入Feature对象中。据我所知,“django-geojson”在这里做得很对。 - James Mills
@Richard:我已经尽力回答你的问题了,如果没有帮助到你,我很乐意进一步完善答案。请问你能否展示一下你的模型以及未使用过滤器序列化对象的输出结果? - Peter Brittain
@Richard,你的“code”属性是ForeignKey吗? - jcs
1
可能是GeoDjango序列化GeoJSON跳过'id'字段的重复问题。 - user528025
实际上,我认为这是相反的情况,因为这个问题早在6个月前就已经被提出了。 - Peter Brittain
1个回答

5
我已经快速浏览了GeoJSON规范,似乎只是说明了属性字段是一个独立的JSON对象,因此如果您希望在JSON转储的该部分中包含它,则符合当前规范的要求。 也就是说,这个规范仍处于草案形式,因此可能会发生变化(并且可能会对此字段施加额外的限制)。 假设您可以接受这一点,我们可以继续...
处理此代码的是geojson序列化器。 目前,它只会在get_dump_object()中为几何、类型和属性字段创建数据。 但是请注意,属性字段呈现了self._current中的任何内容。 实际上,该字段是由父类方法迭代对象的其余字段时建立的。
在调用 get_dump_object() 方法时,self._current 应当包含对象中所有其他可序列化的字段。如您在 base 序列化类中所见,只有当字段使用 serialize=True 构造并且该字段在传递给 serialize() 的指定字段列表中(或者您没有指定筛选器,因此将获取所有内容)时,才会对其进行序列化。因此,我猜测您的 code 字段已被声明为不可序列化,或者它具有与筛选器不匹配的意外内部名称。

为了尝试修复它,我建议查看您在 Model 中 code 字段的声明是否存在错误的 serialize 参数,然后尝试在没有任何字段列表的情况下进行序列化。希望其中一种方法可以将丢失的字段放入 JSON 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接