gpt4 book ai didi

django - 如何使用不同的序列化程序反序列化 POST 请求

转载 作者:行者123 更新时间:2023-12-02 03:39:56 24 4
gpt4 key购买 nike

我正在尝试使用与从 Model 派生并用于 GET 或 PUT 请求的序列化器不同的序列化器来处理 API 端点中的 POST 请求。 POSTed 消息的格式与模型和 GET/PUT 不同,必须在存储到数据库之前进行预处理。

作为我的问题的演示,我制作了一个非常简单的模型以及相应的 API View 和序列化器:

class Message(models.Model): 
message = models.CharField(max_length = 500)

class MessageSerializer(serializers.ModelSerializer):
class Meta:
model = Message
fields = ('message',)

class MessageViewSet(viewsets.ModelViewSet):
queryset = Message.objects.all().order_by('-pk')
serializer_class = MessageSerializer

效果很好。然后我尝试重写 MessageViewSet.create() 以不同方式处理 POST 请求。

class MessageSerializer_FromTo(serializers.Serializer):
sender = serializers.EmailField()
recipient = serializers.EmailField()

def create(self, validated_data):
message = "Message from <{sender}> to <{recipient}>".format(**validated_data)
return Message(message)

class MessageViewSet(viewsets.ModelViewSet):
queryset = Message.objects.all().order_by('-pk')
serializer_class = MessageSerializer

# Handle POST requests differently
def create(self, request, format=None):
message = MessageSerializer_FromTo(data = request.data)
if message.is_valid():
message.save()
return Response(message.data, status=status.HTTP_201_CREATED)
return Response(message.errors, status=status.HTTP_400_BAD_REQUEST)

本质上我想将此 JSON 传递给 POST/api/messages/

{"sender": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="790a16141c3916171c571a1614" rel="noreferrer noopener nofollow">[email protected]</a>", "recipient": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="97e4f8faf2f8f9f2d7f2fbe4f2b9f8e5f0" rel="noreferrer noopener nofollow">[email protected]</a>"}

GET/api/messages/1/应该返回

{"message": "Message from <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5625393b33163938337835393b" rel="noreferrer noopener nofollow">[email protected]</a>> to <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7605191b1319181336131a051358190411" rel="noreferrer noopener nofollow">[email protected]</a>>"}

但是 POST 失败并显示以下消息:

Internal Server Error: /api/messages/
Traceback (most recent call last):
File ".../rest_framework/fields.py", line 441, in get_attribute
return get_attribute(instance, self.source_attrs)
File ".../rest_framework/fields.py", line 100, in get_attribute
instance = getattr(instance, attr)
AttributeError: 'Message' object has no attribute 'sender'


During handling of the above exception, another exception occurred:
[...]
AttributeError: Got AttributeError when attempting to get a value for field `sender` on serializer `MessageSerializer_FromTo`.
The serializer field might be named incorrectly and not match any attribute or key on the `Message` instance.
Original exception text was: 'Message' object has no attribute 'sender'.
[26/Feb/2018 05:09:08] "POST /api/messages/ HTTP/1.1" 500 19059

这只是为了清楚地演示问题,我在 POST 处理程序中做了更复杂的事情,但错误是这样的。

知道如何实现我的需要吗? IE。接受与模型字段完全不同的 POST 字段吗?

谢谢!

更新:完整的代码在这里:https://github.com/mludvig/drf-demo

最佳答案

问题出在你的序列化器中。您只需传递模型类 Message(message) 作为 create 函数的输出,而不是 Message 对象

class MessageSerializer_FromTo(serializers.Serializer):
sender = serializers.EmailField(write_only=True)
recipient = serializers.EmailField(write_only=True)
message = serializers.CharField(read_only=True, max_length = 500)

def create(self, validated_data):
message = "Message from <{sender}> to <{recipient}>".format(**validated_data)
return Message.objects.create(message=message)

关于django - 如何使用不同的序列化程序反序列化 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48982431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com