如何使用Django REST gis使用ember

时间:2014-10-06 09:26:59

标签: ember-data django-rest-framework gis geojson django-rest-framework-gis

我目前正在尝试使用ember-django-adapter设置ember与Django的REST Framework进行交互。

这完美无瑕。但是自从我开始使用djangorestframework-gis之后,ember就再也无法处理响应了。

我没有发现任何人使用ember构建geoJSON,除了:https://gist.github.com/cspanring/5114078但这似乎不是正确的方法,因为我不想更改数据模型?

这是api-response:

{
    "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
}
]

我对此的看法是编写自己的Serializer:

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

我在这里缺少什么?或者这是错误的方法?有没有人试图让这个工作?

另一种方法是在服务器端处理这个问题,只需输出一个常规的restframework响应,并在后端设置lat和long。

1 个答案:

答案 0 :(得分:0)

这不是上述问题的有效答案。无论如何我想分享我的解决方案, 以防任何人遇到同样的情况:

我现在不返回有效的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可以轻松处理格式。