繁体   English   中英

Django REST Framework:在反序列化期间更改密钥

[英]Django REST Framework: Changing keys during deserialization

我正在使用 Django rest 框架在 Django 中编写一个小应用程序。 目标非常简单:我希望能够通过附加了 JSON 对象的 HTTP POST 方法获取请求。 最后,我想返回相同的 JSON 对象,但键值不同。 准确地说,我想将关键值从德语翻译成英语。

所以这就是我会得到的: { "vorname": "John", "nachname": "Doe" }

这就是我要返回的内容: { "firstname": "John", "lastname": "Doe" }

我正在尝试使用序列化程序来做到这一点,它已经可以工作了,只是不是我想要的工作方式。

这是我正在使用的模型:

class Name(models.Model):
    firstname = models.CharField(max_length=255)
    lastname = models.CharField(max_length=255)

这是序列化程序:

class NameSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Name
        fields = ['firstname', 'lastname']

当然,也有一种观点:

@api_view(['POST'])
@parser_classes([JSONParser])
def convert(request):
    request.data['firstname'] = request.data.pop('Vorname')
    request.data['lastname'] = request.data.pop('Nachname')
    serializer = NameSerializer(data=request.data)

    if serializer.is_valid():
        print(serializer.data)
        serializer.save()
        return Response(serializer.data, status=status.HTTP_200_OK)  
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

所以正如我所说,这已经可以使用dict.pop()来转换request.data字典。 但我希望它做的是尽可能管理序列化程序内部的映射,以便视图中不需要任何额外的代码。 搜索了几个小时后,我的头现在只是头晕目眩,我不知道这是否可能。

所以问题是:如何仅使用序列化程序将德语键映射到我的英语键?

所以我为其他搜索的人找到了答案。 这并不完美,我觉得有更好的方法来做到这一点。 如果您有更好的想法,请随时在此处发布 =)

我只是在我的序列化程序中编写了__init__函数的覆盖,所以它现在看起来像这样:

class NameSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Name
        fields = ['firstname', 'lastname']

    def __init__(self, instance=None, data=empty, **kwargs):
        super().__init__(instance, data, **kwargs)
        self.initial_data['firstname'] = self.initial_data.pop('Vorname')
        self.initial_data['lastname'] = self.initial_data.pop('Nachname')

所以我基本上把之前的解决方案移到了序列化器上。 感觉不是很干净,但是很管用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM