我在网站上有一个联系表单,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()
?
你可以这样做覆盖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)