2015-06-15 2 views
10

Ich benutze Django 1.8, mit GeoDjango und PostGIS. Ich verwende HttpResponse einige GeoJSON zurückzukehren:Djangos GeoJSON Serializer nicht alle Felder serialisieren?

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') 

in der Konsole diese druckt ein code Feld gerade fein:

99N 

Aber die GeoJSON nicht seinerseits ein properties.code Feld haben. Es hat jedoch ein properties.name, properties.org_type und properties.ons_code Feld.

enter image description here

Warum ist das? Ist code vielleicht ein reservierter Name? Wenn ja, wie kann ich das beheben?

+0

Kann "Code" nicht existieren, wenn es keine ist oder keinen Wert hat, sehe ich den gedruckten Wert auf der Konsole '99N' erscheint einmal, hat die Ergebnisliste nur ein Objekt? Können wir die ganze Antwort sehen? –

+1

Ich glaube das ist * da * '' code'' ist kein gültiger Teil oder eine gültige Spezifikation der [GeoJSON] (http://geojson.org/geojson-spec.html#feature-objects) Spezifikation und ist nicht gültig für in ein Feature-Objekt in serialisierter Form einfügen. '' django-geojson'' macht das * richtige * Ding hier AFAIK. –

+0

@Richard: Ich habe mein Bestes getan, um Ihre Frage zu beantworten und werde die Antwort gerne verfeinern, wenn es nicht hilft. Können Sie bitte zeigen, was Ihr Modell ist und die Ausgabe von der Serialisierung des Objekts ohne Filter war? –

Antwort

4

Ich hatte einen kurzen Blick auf die GeoJSON-Spezifikation und es scheint, dass es so weit geht zu sagen, dass das Eigenschaftsfeld ein eigenes JSON-Objekt ist, also denke ich, dass Sie in dem Brief sind der aktuellen Spezifikation, wenn Sie es in diesem Teil des JSON-Dumps möchten. Diese Spezifikation befindet sich jedoch immer noch in Entwurfsform und unterliegt daher Änderungen (und kann diesem Feld zusätzliche Einschränkungen auferlegen). Vorausgesetzt, dass Sie damit leben können, können wir fortfahren ...

Der Code, der dies behandelt, ist in der geojson Serializer. Dies wird derzeit nur Daten für die Felder Geometrie, Typ und Eigenschaften in get_dump_object() erstellen. Aber Sie werden feststellen, dass das Eigenschaftsfeld alles rendert, was in self._current ist. Dieses Feld ist tatsächlich aufgebaut (durch die Methoden der Elternklassen), während der Serializer über die restlichen Felder des Objekts iteriert.

Wenn get_dump_object() aufgerufen wird, sollte self._current alle anderen serialisierbaren Felder im Objekt enthalten. Wie Sie in der Serialisierungsklasse base sehen können, werden Felder nur dann serialisiert, wenn sie mit serialize=True erstellt wurden und das Feld in der Liste der angegebenen Felder steht, die Sie an übergeben haben (oder Sie haben keinen Filter angegeben) um alles zu bekommen). Ich würde daher vermuten, dass Ihr Feld code als nicht serialisierbar deklariert wurde oder einen unerwarteten internen Namen hat, der nicht mit Ihrem Filter übereinstimmt.

Um zu versuchen, es zu beheben, würde ich einen Blick auf Ihre Erklärung der code Feld in Ihrem Modell für einen schlechten Serialisierungsparameter, dann versuchen Sie einfach Serialisierung ohne Feldliste überhaupt. Hoffentlich bekommt einer von euch das fehlende Feld in den JSON.