2015-06-15 2 views
10

Я использую Django 1.8, с GeoDjango и PostGIS. Я использую HttpResponse вернуть некоторые в формате GeoJSON:Серийный анализатор GeoJSON Django не сериализует все поля?

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? Если да, то как я могу это исправить?

+0

Может быть, «код» не существует, если он отсутствует или не имеет значения. Я вижу, что напечатанное значение на консоли «99N» появляется один раз, имеет ли список результатов только один объект? Можем ли мы увидеть весь ответ? –

+1

Я считаю, что это * потому что * '' code'' не является допустимой частью или собственностью спецификации [GeoJSON] (http://geojson.org/geojson-spec.html#feature-objects) и недействителен для помещается в объект Feature в сериализованной форме. '' django-geojson'' делает * право * вещь здесь AFAIK. –

+0

@ Рихард: Я приложил все усилия, чтобы ответить на ваш вопрос и с удовольствием уточню ответ, если это не поможет. Можете ли вы показать, что такое ваша модель, и результат сериализации объекта без фильтров? –

ответ

4

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

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

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

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

Смежные вопросы