【问题标题】:Django Rest Framework return serialized data in orderDjango Rest Framework 按顺序返回序列化数据
【发布时间】:2014-08-17 19:19:56
【问题描述】:

我正在序列化一堆对象,用户 Django Rest Framework 并在前端使用 angularjs 检索信息。当我在浏览器中检查响应时,我返回的对象数组的所有字段都按字母顺序排列,而不是我在后端给出的排序说明。

是什么迫使这种按字母顺序排列的? Django Rest 框架还是 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                                     
}                  

【问题讨论】:

    标签: javascript angularjs django-rest-framework


    【解决方案1】:

    通常,字典/映射/键值数据结构不存储或关心键的顺序。具有相同键值但顺序不同的两个字典被认为是相同的。您甚至可能会说字典中没有键顺序之类的东西(尽管有一些字典的实现可以保留顺序)

    如果您向最终用户显示它们的顺序很重要,例如在 UI 表中,您必须获取对象的键,对它们进行排序,然后使用每个键遍历对象以获得所需的值,http://underscorejs.org/ 库有 keyssort 工具用于你要使用

    【讨论】:

      【解决方案2】:

      排序不适用于 Django 或 AngularJS,它发生在浏览器中,因为 JavaScript 对象没有指定的顺序。请参阅 ECMAScript 规范,特别是 section 4.3.3

      4.3.3 对象

      对象类型的成员

      注意 对象是属性的集合,只有一个 原型对象。原型可能是空值。

      请注意,它没有指定属性集合的顺序。

      同样相关的是在section 12.6.4中定义对象属性枚举的规范

      枚举属性的机制和顺序(步骤 6.a) 第一个算法,第二个中的步骤 7.a 没有指定。

      您必须在 AngularJS 中自定义客户端的顺序。但是,请注意orderBy 过滤器仅适用于数组。请参阅此答案以创建自定义指令以对对象属性进行排序:

      https://stackoverflow.com/a/18186947/1870541

      【讨论】:

        猜你喜欢
        • 2018-06-23
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 2018-10-29
        • 2015-06-29
        • 2015-01-12
        • 2016-07-21
        • 2015-12-13
        相关资源
        最近更新 更多