我将一堆对象序列化用户Django Rest Framework并在前端检索带有angularjs的信息。当我在浏览器中检查响应时,我返回的对象数组的所有字段都按字母顺序排列,而不是我在后端给出的排序说明。
什么是强制按字母排序? Django Rest Framework还是angularjs?这个订单搞砸了我试图创造的桌子。
data['objects'] = serializer.data
print data['objects'][0]
return Response(data)
从django打印输出
{'hard_weight': 0L, 'current_count': 8020L, 'mileage': 0L, 'route_type': None, 'route': u'NO SCHEDULE', 'destination': None, 'pickup_id
': 657L, 'specials': 900000L, 'soft_weight': 0L, 'misses': 0L, 'date': datetime.date(2030, 12, 31), 'estimated_hours': Decimal('0.00'),
'estimated_hours_unload': Decimal('0.00'), 'cancel': False}
console.log返回的数据:
cancel: false
current_count: 8020
date: "2030-12-31"
destination: null
estimated_hours: "0.00"
estimated_hours_unload: "0.00"
hard_weight: 0
mileage: 0
misses: 0
pickup_id: 657
route: "NO SCHEDULE"
route_type: null
soft_weight: 0
specials: 900000
更新/溶液 我最后写了这个函数来接收我的每个对象,并按给定列表的顺序将它们放在一个数组中。
function convertObjects(objects, list){
blank = []
for(var i=0; i <objects.length; i++)
{
obj = []
object = objects[i]
for (var j=0; j<=list.length; j ++)
{
obj.push(object[list[j]])
};
blank.push(obj)
};
return blank
}
答案 0 :(得分:1)
由于JavaScript对象没有指定的顺序,因此Django或AngularJS无法进行排序,它在浏览器中发生。请参阅ECMAScript规范,尤其是section 4.3.3:
4.3.3对象
Object类型的成员
注意对象是属性的集合,只有一个 原型对象。原型可能是空值。
请注意,它没有指定属性集合的顺序。
同样相关的是在section 12.6.4
中定义对象属性枚举的规范枚举属性的机制和顺序(步骤6.a) 第一个算法,第二个步骤7.a未指定。
您必须在AngularJS中自定义客户端的订单。但请注意,orderBy
过滤器仅适用于阵列。请参阅此答案以创建用于订购对象属性的自定义指令:
答案 1 :(得分:1)
通常,字典/地图/键值数据结构不存储或关心键的顺序。具有相同键值但具有不同顺序的两个字典被认为是相同的。你甚至可能会说字典中没有关键顺序(尽管有字典的实现可以保留顺序)
如果您向最终用户显示这些订单的顺序很重要,例如在UI表格中,您必须获取对象的键,对其进行排序,然后使用每个键遍历对象以获得所需的值,http://underscorejs.org/库具有keys
和{ {1}}使用的工具