【问题标题】:How can I control ordering of the JSON returned by django REST framwork?如何控制 django REST 框架返回的 JSON 的顺序?
【发布时间】:2015-05-28 06:17:09
【问题描述】:

我想了解要编写什么级别的代码来控制 django 序列化程序返回的顺序。必须在模板级别、模型级别或序列化程序级别完成。什么决定了任何序列化程序返回的 JSON 中字段的顺序?在我的示例中,考虑这些序列化程序类:

class FilterURLSerializer(serializers.Serializer):
    active = serializers.CharField(read_only=True)
    inactive = serializers.CharField(read_only=True)


class FacetedFilterOptionsSerializer(serializers.Serializer):
    name = serializers.CharField(read_only=True)
    slug = serializers.CharField(read_only=True)
    count = serializers.IntegerField(read_only=True)
    active = serializers.BooleanField(read_only=True)
    urls = FilterURLSerializer(read_only=True)


class FacetedFilterSerializer(serializers.Serializer):
    name = serializers.CharField(read_only=True)
    slug = serializers.CharField(read_only=True)
    options = FacetedFilterOptionsSerializer(source='options')

以及返回的 JSON 数据:

{'name': u'Skill level', 'slug': u'skill', 'options': [{'name': u"I'm Learning", 'slug': u'beginner', 'count': 0, 'active': False, 'urls': {'active': u'/en-US/search?skill=beginner', 'inactive': u'/en-US/search'}}, {'name': u"I'm an Expert", 'slug': u'advanced', 'count': 0, 'active': False, 'urls': {'active': u'/en-US/search?skill=advanced', 'inactive': u'/en-US/search'}}, {'name': u'Intermediate', 'slug': u'intermediate', 'count': 0, 'active': False, 'urls': {'active': u'/en-US/search?skill=intermediate', 'inactive': u'/en-US/search'}}]}

我想知道是什么决定了 JSON 中这些字段的顺序以及如何按我想要的方式更改它?

【问题讨论】:

  • JSON 对象是无序的,就像 Python 字典一样。为什么需要这里订购的钥匙?
  • 您是否尝试添加Meta fields 列表?字段应按该顺序序列化。但是请注意,@MartijnPieters 的评论仍然适用。
  • 如果我必须在前端呈现 JSON,以便在“选项字段”中,我想首先列出“我是专家”字段。我怎么能以其他方式做到这一点?在这个 JSON 中,“我正在学习”是“选项”中的第一个字段
  • @dhke 正是我的问题。将 Meta 添加到模型中,例如 ordering = ['name'] 是否确定 JSON?这是一个开源代码库。我要设置的是一个有点复杂的自定义订单。可能我必须将您的解决方案与在序列化程序中设置查询集结合起来,如下所述。试试看! :)
  • @Pypadds 正如 Martijn 所说,JSON 对象中的键/值对是无序的。在您的前端代码中,按您希望它们所在的键顺序显示值。

标签: python json django django-rest-framework


【解决方案1】:

如果您想订购字段名称,可以尝试以下操作:

myList = list(yourmodel.objects.values('filed1','field2').filter(someid=i).orderby('column'))

【讨论】:

    猜你喜欢
    • 2017-08-21
    • 2021-08-14
    • 2023-03-25
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 2014-06-23
    相关资源
    最近更新 更多