我在发布到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)