我目前正在尝试使用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。
答案 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可以轻松处理格式。