2015-06-15 16 views
10

Tôi đang sử dụng Django 1.8, với GeoDjango và PostGIS. Tôi đang sử dụng HttpResponse trở lại một số GeoJSON:Trình nối tiếp GeoJSON của Django không tuần tự hóa tất cả các trường?

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

Trong giao diện điều khiển này in một lĩnh vực code tốt:

99N 

Nhưng GeoJSON trở không có một trường properties.code. Trường có trường properties.name, properties.org_typeproperties.ons_code.

enter image description here

Tại sao điều này? Có phải tên code có thể được đặt trước không? Nếu vậy, làm thế nào tôi có thể sửa lỗi này?

+0

Có thể là 'mã' không tồn tại khi không có hoặc không có giá trị, tôi thấy giá trị được in trên bàn điều khiển '99N' xuất hiện một lần, danh sách kết quả chỉ có một đối tượng? Chúng ta có thể thấy toàn bộ phản ứng không? –

+1

Tôi tin rằng đây là * vì * '' code'' không phải là một phần hoặc proeprty của đặc tả [GeoJSON] (http://geojson.org/geojson-spec.html#feature-objects) và không hợp lệ để đưa vào đối tượng Feature ở dạng tuần tự. '' django-geojson'' đang làm điều * đúng * ở đây AFAIK. –

+0

@Richard: Tôi đã cố hết sức để trả lời câu hỏi của bạn và sẽ vui vẻ tinh chỉnh câu trả lời nếu nó không giúp ích gì. Bạn có thể vui lòng cho biết mô hình của bạn là gì và đầu ra từ serializing đối tượng không có bộ lọc nào? –

Trả lời

4

Tôi đã xem nhanh đặc tả GeoJSON và có vẻ như nó chỉ đi xa đến mức nói rằng trường thuộc tính là một đối tượng JSON theo đúng nghĩa của nó, vì vậy tôi nghĩ bạn đang ở trong thư của đặc tả hiện tại nếu bạn muốn nó trong phần đó của kết xuất JSON. Điều đó nói rằng, spec này vẫn còn ở dạng dự thảo và do đó có thể thay đổi (và có thể đặt thêm những hạn chế về lĩnh vực này). Giả sử rằng bạn có thể sống với điều đó, chúng tôi có thể tiếp tục ...

Mã xử lý việc này nằm trong bộ nối tiếp geojson. Điều này hiện tại sẽ chỉ tạo dữ liệu cho các trường hình học, loại và thuộc tính trong get_dump_object(). Nhưng bạn sẽ lưu ý rằng trường thuộc tính hiển thị mọi thứ trong self._current. Trường đó thực sự được xây dựng (theo các phương thức của các lớp cha mẹ) khi serializer lặp lại trên phần còn lại của các trường trong đối tượng.

Vào thời điểm get_dump_object() được gọi, self._current phải chứa tất cả các trường nối tiếp tuần tự khác trong đối tượng. Như bạn có thể thấy trong lớp tuần tự base, các trường sẽ chỉ được tuần tự hóa nếu chúng được xây dựng với serialize=True và trường nằm trong danh sách các trường được chỉ định mà bạn đã chuyển đến serialize() (hoặc bạn không chỉ định bộ lọc để để có được tất cả mọi thứ). Do đó, tôi sẽ đoán rằng trường code của bạn đã được khai báo là không thể tuần tự hóa hoặc trường có tên nội bộ không mong muốn không khớp với bộ lọc của bạn.

Để cố gắng khắc phục, tôi sẽ xem xét tuyên bố của bạn về trường code trong Mô hình của bạn để có thông số serialize xấu, sau đó chỉ cần thử serializing mà không có bất kỳ danh sách trường nào. Hy vọng rằng một trong số đó đưa trường bị thiếu của bạn vào JSON.

Các vấn đề liên quan