Как заставить Ember работать с Django REST GIS
В настоящее время я пытаюсь настроить ember для взаимодействия с REST Framework Django с помощью адаптера ember-django.
Это работает безупречно. Но так как я начал использовать djangorestframework-gis, ember больше не может обрабатывать ответы.
Я не нашел никого, кто собирал geoJSON с помощью ember, кроме: https://gist.github.com/cspanring/5114078 Но, похоже, это неправильный подход, потому что я не хочу менять модель данных?
Это API-ответ:
{
"type": "FeatureCollection",
"features": [
{
"id": 1,
"type": "Feature",
"geometry": {
"coordinates": [
9.84375,
53.665466308594
],
"type": "Point"
},
"properties": {
"date_created": "2014-10-05T20:08:43.565Z",
"body": "Hi",
"author": 1,
"expired": false,
"anonymous": false,
"input_device": 1,
"image": "",
"lat": 0.0,
"lng": 0.0
}
}
]
}
Пока Ember ожидает что-то вроде:
[{"id":1,
"date_created":"2014-10-05T20:08:43.565Z",
"body":"Hi",
"author":1,
"expired":false,
"anonymous":false,
"input_device":1,
"image":"",
"lat":0,
"lng":0
}
]
Я решил написать собственный сериализатор:
import Ember from "ember";
import DS from "ember-data";
export default DS.DjangoRESTSerializer.extend({
extractArray: function(store, type, payload) {
console.log(payload);
//console.log(JSON.stringify(payload));
var features = payload["features"];
var nPayload = [];
for (var i = features.length - 1; i >= 0; i--) {
var message = features[i];
var nmessage = {"id": message.id};
for(var entry in message.properties){
var props = message.properties;
if (message.properties.hasOwnProperty(entry)) {
var obj = {}
nmessage[entry]=props[entry];
}
}
nPayload.push(nmessage);
};
console.log(nPayload); //prints in the format above
this._super(store, type, nPayload);
},
})
Но я получаю следующую ошибку:
The response from a findAll must be an Array, not undefined
Что мне здесь не хватает? Или это неправильный подход? Кто-нибудь когда-нибудь пытался заставить это работать?
Альтернативой было бы обработать это на стороне сервера и просто вывести регулярный ответ перезапуска и установить lat и long в бэкэнде.
1 ответ
Это неверный ответ на вопрос выше. В любом случае я хотел поделиться своим решением, на случай, если кто-нибудь попадет в такую же ситуацию:
Теперь я не возвращаю действительный geoJSON, а пользовательские значения lat, lng. Ниже приведен внутренний код для django-rest-framework: Модель:
#models/message.py
class Message(models.Model):
def lat(self):
return self.location.coords[1]
def lng(self):
return self.location.coords[0]
И в сериализаторе:
#message/serializer.py
class MessageSerializer(serializers.ModelSerializer):
lat = serializers.Field(source="lat")
lng = serializers.Field(source="lng")
Ember легко справится с форматом.