如何在 Django Rest Framework(DRF)中为 ModelSerializers 编写自定义字段验证,类似于 Django 中的表单验证?
How to write a Custom field Validation for ModelSerializers in Django Rest Framework(DRF) similar to Form Validation in Django?
我目前正在创建一个基于 DRF.I 的 api 模型如下:
class Task(models.Model):
name = models.CharField(max_length = 255)
completed = models.BooleanField(default = False)
description = models.TextField()
text = models.TextField(blank = False, default = "this is my text" )
def __unicode__(self):
return self.name
此模型对应的序列化程序为:
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = ('name','description','completed','text')
现在我的问题是我想在获取数据时验证模型的 'name' 字段。
例如,我可能会通过类似于 Django 表单的 Python 代码结束检查用户的名字或第二个名字:
def clean_name(self):
name = form.cleaned_data.get('name')
first,second = name.split(' ')
if second is None:
raise forms.ValidationError("Please enter full name")
我在 Serializers.serializer class 中知道一个叫做 'validate_(fieldname)' 的东西。但我希望在 Serializers.ModelSerializer 中使用它。(类似于 Django 中的自定义表单验证)
您可以向您的序列化器 添加一个validate_name()
方法来执行此验证。它应该 return 验证值或提出 ValidationError
.
要执行检查用户是否输入了全名,我们将使用 str.split()
,这将 return 字符串中的所有单词。如果没有。字符串中单词的个数不大于1,那么我们就加一个ValidationError
。否则,我们 return value
.
class TaskSerializer(serializers.ModelSerializer):
def validate_name(self, value):
"""
Check that value is a valid name.
"""
if not len(value.split()) > 1: # check name has more than 1 word
raise serializers.ValidationError("Please enter full name") # raise ValidationError
return value
我目前正在创建一个基于 DRF.I 的 api 模型如下:
class Task(models.Model):
name = models.CharField(max_length = 255)
completed = models.BooleanField(default = False)
description = models.TextField()
text = models.TextField(blank = False, default = "this is my text" )
def __unicode__(self):
return self.name
此模型对应的序列化程序为:
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = ('name','description','completed','text')
现在我的问题是我想在获取数据时验证模型的 'name' 字段。 例如,我可能会通过类似于 Django 表单的 Python 代码结束检查用户的名字或第二个名字:
def clean_name(self):
name = form.cleaned_data.get('name')
first,second = name.split(' ')
if second is None:
raise forms.ValidationError("Please enter full name")
我在 Serializers.serializer class 中知道一个叫做 'validate_(fieldname)' 的东西。但我希望在 Serializers.ModelSerializer 中使用它。(类似于 Django 中的自定义表单验证)
您可以向您的序列化器 添加一个validate_name()
方法来执行此验证。它应该 return 验证值或提出 ValidationError
.
要执行检查用户是否输入了全名,我们将使用 str.split()
,这将 return 字符串中的所有单词。如果没有。字符串中单词的个数不大于1,那么我们就加一个ValidationError
。否则,我们 return value
.
class TaskSerializer(serializers.ModelSerializer):
def validate_name(self, value):
"""
Check that value is a valid name.
"""
if not len(value.split()) > 1: # check name has more than 1 word
raise serializers.ValidationError("Please enter full name") # raise ValidationError
return value