当前位置:  开发笔记 > 编程语言 > 正文

DRF:验证后但在创建之前删除模型序列化程序上的字段(在CreateAPIView上)

如何解决《DRF:验证后但在创建之前删除模型序列化程序上的字段(在CreateAPIView上)》经验,为你挑选了1个好方法。

我在网站上有一个联系表单,CreateAPIView用于创建模型的新实例(最终通过电子邮件发送给管理员).在我的序列化程序中,我有一个蜜罐字段来帮助拒绝垃圾邮件.

该模型:

class Message(models.Model):
    name = ...
    message = ...

和序列化器:

class MessageSerializer(serializers.ModelSerializer):

    # Honeypot field
    url = serializers.CharField(allow_blank=True, required=False)

    class Meta:
        model = Message
        fields = '__all__'

    def validate_url(self, value):
        if value and len(value) > 0:
            raise serializers.ValidationError('Spam')
        return value

并查看:

class MessageView(generics.CreateAPIView):
    ''' Create a new contact form message. '''
    serializer_class = MessageSerializer

我的问题是,就目前而言,当我发布到此视图时,我收到错误:

TypeError:TypeError在调用时得到了一个Message.objects.create().这可能是因为序列化程序类上的可写字段不是有效参数Message.objects.create().您可能需要将该字段设置为只读,或重写MessageSerializer.create()方法以正确处理此字段.

很明显,seriazlier正试图将该url字段保存到模型中CreateApiView.perform_create()

我尝试添加read_only到序列化程序字段,但这意味着url_validate完全跳过该方法.

如何在验证发生之前将字段保留在序列化程序中,在serializer.save()调用之前将其删除perform_create()



1> Anush Devend..:

你可以这样做覆盖create方法,如:

class MessageSerializer(serializers.ModelSerializer):

    # Honeypot field
    url = serializers.CharField(allow_blank=True, required=False)

    class Meta:
        model = Message
        fields = '__all__'

    def validate_url(self, value):
        if value and len(value) > 0:
            raise serializers.ValidationError('Spam')
        return value

    def create(self, validated_data):
        data = validated_data.pop('url')
        return Message.objects.create(**data)


感谢您的回复,但是`Message.objects.create(**data)`不正确您应该传递`validated_data`而不是我的意思是`Message.objects.create(**validated_data)`
推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有