2015-06-15 45 views
10

我使用Django 1.8,GeoDjango和PostGIS。我使用HttpResponse返回一些以GeoJSON:Django的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保留名稱?如果是這樣,我該如何解決這個問題?

+0

可能是「代碼」並不時,它的無或有沒有存在的價值,我看到控制檯「99N」打印的值出現一次,沒有結果列表只有一個對象?我們可以看到整個迴應? –

+1

我相信這是因爲* *''code''不是[以GeoJSON](http://geojson.org/geojson-spec.html#feature-objects)規範的有效部分或媒體資源相關聯並且是無效的以序列化形式放入Feature對象。 ''django-geojson''在這裏正在做*正確的事情。 –

+0

@Richard:我已經盡力回答你的問題,如果沒有幫助,我會很樂意地改進答案。你可以請示出你的模型是什麼,並且沒有過濾器序列化對象的輸出是? –

回答

4

我已經快速瀏覽了GeoJSON規範,它看起來似乎只是說屬性字段本身就是一個JSON對象,所以我認爲你在信中如果您希望在JSON轉儲的那部分中使用當前規範。也就是說,這個規範仍然是草案形式,因此可能會發生變化(並且可能會對此字段添加額外的限制)。假設你可以忍受的,我們可以繼續...

處理這個是在geojson串行代碼。目前這隻會爲get_dump_object()中的幾何,類型和屬性字段創建數據。但是你會注意到,屬性字段呈現self._current中的任何內容。該字段實際上是由(通過父類的方法)構建的,因爲序列化程序遍歷對象中的其餘字段。

在調用get_dump_object()時,self._current應包含對象中所有其他可序列化的字段。正如你可以在base序列化器類看,如果它們與serialize=True構建和領域是你傳遞給serialize()指定的字段列表字段只會序列化(或者你要去你沒有指定一個過濾器得到一切)。因此,我會猜測你的code字段已被聲明爲不可序列化,或者它有一個與您的過濾器不匹配的意外內部名稱。

要嘗試修復它,我會看看你的模型中的code字段聲明瞭一個糟糕的序列化參數,然後試着序列化,而沒有任何字段列表。希望其中的一個可以將你缺少的字段放入JSON中。