如何为Django Rest Framework(DRF)中的ModelSerializers编写自定义字段验证,类似于Django中的表单验证?

Rah*_*hul 3 django django-validation django-serializer django-rest-framework

我目前正在创建一个基于DRF的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
Run Code Online (Sandbox Code Playgroud)

此模型的相应Serializer如下:

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ('name','description','completed','text')
Run Code Online (Sandbox Code Playgroud)

现在我的问题是我想在获取数据时验证模型的"名称"字段.例如,我可能会通过类似于Django Form的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")
Run Code Online (Sandbox Code Playgroud)

我在Serializers.serializer类中知道名为'validate_(fieldname)'的东西.但我希望在Serializers.ModelSerializer中使用它.(类似于Django中的自定义表单验证)

Rah*_*pta 8

您可以向序列化程序添加一个validate_name()方法,该方法将执行此验证.它应返回验证值或提高a ValidationError.

要检查用户是否输入了全名,我们将使用str.split()它将返回字符串中的所有单词.如果没有.字符串中的单词不大于1,那么我们将提出一个ValidationError.否则,我们返回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
Run Code Online (Sandbox Code Playgroud)

  • 是的,存在“serializer.validated_data”,在序列化器上调用“.is_valid()”后可以访问该数据。 (2认同)
  • 您还可以在模型类的字段中使用`validators`参数,DRF也会使用它.有助于实施全局验证.这个答案也是正确的. (2认同)