Как заставить 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 легко справится с форматом.

Другие вопросы по тегам