Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django restframework将关系序列化为字典而不是数组_Python_Json_Django_Django Rest Framework - Fatal编程技术网

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

Python django restframework将关系序列化为字典而不是数组,python,json,django,django-rest-framework,Python,Json,Django,Django Rest Framework,我正在尝试将外键序列化为字典而不是数组。 现在,json如下所示: { "slug": "en", "children": [{ "slug": "pants", "children": [{ "slug": "products/:level1", "children": [{ "slug": ":level2/:level3",

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

{
"slug": "en",
"children": [{
        "slug": "pants",
        "children": [{
                "slug": "products/:level1",
                "children": [{
                    "slug": ":level2/:level3",
                    "children": []
                }]
            },
            {
                "slug": ":productSlug",
                "children": []
            }
        ]
    },
    {
        "slug": "pullovers",
        "children": []
    }
   ]
}
但我想用鼻涕虫做钥匙:

{
"en": {
    "children": {
        "pants": {
            "children": {
                "products/:level1": {
                    "children": {
                        ":level2/:level3": {
                            "children": {}
                        }
                    }
                }
            },
            ":productSlug": {
                "children": {}
            }
        ]
    }
 }
}

可以直接在序列化程序中进行转换,还是必须在附加步骤中进行转换?

可以通过为每个需要序列化程序的序列化程序重写和设置
列表\u serializer\u类
,正如我在本文中建议的那样

当然,您需要稍微调整它:

class <YourClass>ListSerializer(serializers.ListSerializer):
    def to_representation(self, data):
        r = super().to_representation(data)

        return { item['<key_field>']: item for item in r }
类ListSerializer(serializers.ListSerializer): def到_表示(自身、数据): r=super().到_表示(数据) 返回{item['']:r}中项的项 @Michael Rigonis答案()是成功的关键。我不得不稍微调整一下,这样我就可以在顶级游戏中使用它了

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)

回答得好。我不得不稍微调整一下,这样我就可以在顶级游戏中使用它了。请看我的答案。看DRF代码,似乎确实有必要在
data
中使用
ReturnDict