РЕДАКТИРОВАТЬ После подтверждения непустого набора запросов:
Я нашел проблему, связанную с кодом ядра модуля vectorformats
.
В частности, внутри GeoJSON.encode
в этой конкретной строке :
if to_string:
result = json_dumps(list(result_data))
list()
вызывает проблему.
Давайте воссоздадим проблему с минимальным примером:
>>> import json
>>> test = {'a': 5, 'b': [1, 2, 3], 'c': {'e': 2, 'f': 5}}
>>> list(test)
['a', 'b', 'c']
Здесь мы видим то же поведение, что и вопрос. Давайте рассмотрим это немного дальше:
>>> json.dumps(list(test))
'["a", "b", "c"]'
Но без list()
:
>>> json.dumps(test)
'{"a": 5, "b": [1, 2, 3], "c": {"e": 2, "f": 5}}'
Поэтому есть 2 возможных решения этой проблемы:
- Изменить код
vectorformat
, удалив вызов list()
.
Вызовите метод encode
с помощью to_string=False
и "jsonify" полученного словаря самостоятельно следующим образом:
import json
def geojsonFeed(request):
queryset = WorldBorder.objects.all()
djf = Django.Django(geodjango="mpoly", properties=['name', 'iso3'])
geoj = GeoJSON.GeoJSON()
s = geoj.encode(djf.decode(queryset), to_string=False)
return HttpResponse(json.dumps(s))
Ну, после быстрого изучения вашего модуля, он, кажется, работает как задумано, так что это не причина.
Взгляните на метод GeoJSON.encode()
:
def encode(self, features, to_string=True, **kwargs):
"""
Encode a list of features to a JSON object or string.
to_string determines whethr it should convert the result to
a string or leave it as an object to be encoded later
"""
results = []
result_data = None
for feature in features:
data = self.encode_feature(feature)
for key,value in data['properties'].items():
if value and isinstance(value, str):
data['properties'][key] = str(value)
results.append(data)
result_data = {
'type':'FeatureCollection',
'features': results,
'crs': self.crs
}
if to_string:
result = json_dumps(list(result_data))
else:
result = result_data
return result
Структура result_data
имеет структуру ["type", "features", "crs"]
и преобразуется в список json, поскольку по умолчанию у вас есть аргумент to_string
True
.
Единственная причина вашей проблемы, которую я могу себе представить, заключается в том, что запрос querySet = WorldBorder.objects.filter()
пуст .
Кстати, используя filter()
без аргументов, вы получите результат, аналогичный запросу all()
.