按键对DictField的DRF序列化器输出进行排序

时间:2017-06-07 16:21:45

标签: django sorting dictionary django-rest-framework serializer

我有一个使用DictField的Django Rest Framework序列化程序:

class FlatArticleSerializer(Serializer):
    attributes = DictField(child=FlatArticleAttributeSerializer())

输出始终不同,因为属性是字典,根据定义,它不是排序的。有没有办法在输出中对这些进行排序,例如按字母顺序排序?

3 个答案:

答案 0 :(得分:1)

如果内部值存储在OrderedDict中,则键将按OrderedDict的顺序排列。您可以像to_representation一样对此进行后期处理:

def to_representation(self, instance):

    representation = super().to_representation(instance)

    attributes_dict = representation['attributes']
    attribute_keys_sorted = sorted(attributes_dict.keys())

    # Build ordered dictionary with sorted keys
    sorted_attribute_dict = OrderedDict()
    for key in attribute_keys_sorted:
        sorted_attribute_dict[key] = attributes_dict[key]

    representation['attributes'] = sorted_attribute_dict

    return representation

答案 1 :(得分:0)

使用

class Meta:
  order_by = (('attributes',))

这将根据属性字段

对数据进行排序

答案 2 :(得分:-1)

为什么不使用嵌套的序列化程序呢?我相信它会按照序列化程序的fields指示对键进行排序:

class FlatArticleSerializer(Serializer):
    attributes = FlatArticleAttributeSerializer()