首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >django-restframework将关系序列化为字典而不是数组

django-restframework将关系序列化为字典而不是数组
EN

Stack Overflow用户
提问于 2017-07-21 18:58:11
回答 2查看 335关注 0票数 3

我正在尝试将外键序列化为字典而不是数组。现在,json看起来如下所示:

代码语言:javascript
复制
{
"slug": "en",
"children": [{
        "slug": "pants",
        "children": [{
                "slug": "products/:level1",
                "children": [{
                    "slug": ":level2/:level3",
                    "children": []
                }]
            },
            {
                "slug": ":productSlug",
                "children": []
            }
        ]
    },
    {
        "slug": "pullovers",
        "children": []
    }
   ]
}

但我希望它能使用这些弹头作为密钥:

代码语言:javascript
复制
{
"en": {
    "children": {
        "pants": {
            "children": {
                "products/:level1": {
                    "children": {
                        ":level2/:level3": {
                            "children": {}
                        }
                    }
                }
            },
            ":productSlug": {
                "children": {}
            }
        ]
    }
 }
}

有没有可能直接在序列化程序中这样做,或者我必须在额外的步骤中转换它?

EN

回答 2

Stack Overflow用户

发布于 2017-07-21 20:51:51

可以通过覆盖list serializers并为每个需要它的序列化程序设置list_serializer_class,正如我在此answer中建议的那样。

当然,你需要稍微调整一下:

代码语言:javascript
复制
class <YourClass>ListSerializer(serializers.ListSerializer):
    def to_representation(self, data):
        r = super().to_representation(data)

        return { item['<key_field>']: item for item in r }
票数 1
EN

Stack Overflow用户

发布于 2017-07-25 17:34:36

@Michael Rigonis answer (https://stackoverflow.com/a/45238191/270265)是成功的关键。我必须对它进行一些调整,所以我也可以在顶层使用它。

代码语言:javascript
复制
class DictSerializer(serializers.ListSerializer):
    key = None

    def __init__(self, *args, **kwargs):
        self.key = kwargs.pop('key', self.key)
        super().__init__(*args, **kwargs)

    def to_representation(self, data):    
        r = super().to_representation(data)
        return {item[self.key]: item for item in r}

    @property
    def data(self):
        # This is a bit nasty, because the only "Many-Serializer" is a ListSerializer we inherit of it,
        # but when converting it to json we call the BaseSerializer directly, because we want a Dictionary rather then a list
        ret = super(serializers.ListSerializer, self).data
        return ReturnDict(ret, serializer=self)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45235931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档