[英]Django Rest Framework - deserialization of a TaggableManager field
[英]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.