Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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
Django 如何使用不同的序列化程序反序列化POST请求_Django_Django Rest Framework - Fatal编程技术网

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

Django 如何使用不同的序列化程序反序列化POST请求,django,django-rest-framework,Django,Django Rest Framework,我试图在API端点中使用不同于从模型派生并用于GET或PUT请求的序列化程序的序列化程序来处理POST请求。发布消息的格式不同于模型和GET/PUT,必须在存储到数据库之前进行预处理 作为问题的演示,我制作了一个非常简单的模型以及相应的API视图和序列化程序: class Message(models.Model): message = models.CharField(max_length = 500) class MessageSerializer(serializers.Mod

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

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

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)
GET/api/messages/1/应该返回

{"message": "Message from <some@one.com> to <someone@else.org>"}
这只是为了说明问题,显然,我在我的POST处理程序中做了更复杂的事情,但错误是这样的

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

谢谢


更新:完整的代码在这里:

问题在于序列化程序中。您只是将模型类
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)
class MessageSerializer\u FromTo(serializers.Serializer):
发件人=序列化程序.EmailField(仅写=True)
收件人=序列化程序.EmailField(仅写=True)
message=serializers.CharField(只读=True,最大长度=500)
def创建(自我验证的_数据):
message=“message from to.”格式(**已验证的数据)
返回Message.objects.create(Message=Message)

通过覆盖viewset的
get\u serializer\u类
方法,可以根据方法类型获得不同的序列化程序

class MessageViewSet(viewsets.ModelViewSet):
    model = Message

    def get_serializer_class(self):
        serializers_class_map = {
            'default': DefaultSerializer,
            'create': CreateMessageSerializer,
        }
        return serializers_class_map.get(self.action, serializers_class_map['default'])
您还可以覆盖
CreateMessageSerializer
to_表示法
以获得不同的输出

class CreateMessageSerializer(serializer.ModelSerializer):

    class Meta:
        model = Message
        fields = (
            'sender', 'recipient'
        )

    def to_representation(self, instance):
        return {
            'message': "Message from <{0.sender}> to <{0.recipient}>".format(instance)
        }
class CreateMessageSerializer(serializer.ModelSerializer):
类元:
模型=消息
字段=(
“发件人”、“收件人”
)
def到_表示(自身、实例):
返回{
'message':“messagefrom to.”格式(实例)
}

要使用不同的序列化程序,取决于序列化程序是将请求中的数据反序列化还是将其序列化为响应,可以使用

它有泛型类来帮助您构建类似Django REST框架的视图,但是,它们不是只使用一个
serializer\u类
,而是使用
read\u serializer\u类
write\u serializer\u类


您可以在中阅读有关安装和使用的更多说明。

恐怕这没有帮助,仍然是相同的问题。我已经添加了一个到github的链接,问题演示源:序列化程序已更新。请重试。序列化程序需要对象中的发件人和收件人字段。这就是问题所在。它看起来很有希望,但我无法让它发挥作用。我正在获取
django.core.exceptions.impropertlyconfigured:字段名“sender”对模型“Message”无效。
以下是源代码:
class MessageViewSet(viewsets.ModelViewSet):
    model = Message

    def get_serializer_class(self):
        serializers_class_map = {
            'default': DefaultSerializer,
            'create': CreateMessageSerializer,
        }
        return serializers_class_map.get(self.action, serializers_class_map['default'])
class CreateMessageSerializer(serializer.ModelSerializer):

    class Meta:
        model = Message
        fields = (
            'sender', 'recipient'
        )

    def to_representation(self, instance):
        return {
            'message': "Message from <{0.sender}> to <{0.recipient}>".format(instance)
        }