Серийный анализатор 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.name, properties.org_type и properties.ons_code.

enter image description here

Почему это? Возможно ли code зарезервированное имя? Если да, то как я могу это исправить?

Ответ 1

Я быстро просмотрел спецификацию GeoJSON, и оказалось, что это только говорит о том, что поле свойств является объектом JSON в своем собственном праве, поэтому я думаю, что вы находитесь в письме текущую спецификацию, если вы хотите ее в этой части дампа JSON. Тем не менее, эта спецификация все еще находится в черновом варианте и поэтому может быть изменена (и может все же создавать дополнительные ограничения для этого поля). Предполагая, что вы можете жить с этим, мы можем продолжить...

Код, обрабатывающий это, находится в сериализаторе geojson. В настоящее время это создаст данные только для полей геометрии, типа и свойств в get_dump_object(). Но вы заметите, что поле свойств отображает все, что находится в self._current. Это поле фактически создается (по методам родительских классов), поскольку сериализатор выполняет итерацию по остальным полям объекта.

К моменту вызова get_dump_object() self._current должен содержать все другие сериализуемые поля в объекте. Как вы можете видеть в классе base, поля будут сериализованы, только если они построены с помощью serialize=True, и поле находится в список указанных полей, которые вы передали, в serialize() (или вы не указали фильтр, чтобы вы все получили). Поэтому я предполагаю, что ваше поле code было объявлено как не сериализуемое, или оно имеет неожиданное внутреннее имя, которое не соответствует вашему фильтру.

Чтобы попытаться исправить это, я бы посмотрел ваше объявление в поле code в вашей модели для плохого параметра serialize, а затем просто попробуйте сериализовать без какого-либо списка полей. Надеюсь, один из них получит ваше пропавшее поле в JSON.