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

该模型:

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

我的问题是,按现状,当我发布到该 View 时,我得到了错误:



所以显然seriazlier试图将url字段保存到CreateApiView.perform_create()中的模型中

我尝试将read_only添加到序列化器字段中,但这意味着url_validate方法被完全跳​​过了。

如何在验证通过之前将字段保留在序列化器上,在serializer.save()中调用perform_create()之前将其删除?

最佳答案

您可以像这样覆盖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)

09-30 23:43