3

我目前正在创建一个基于 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

该模型的相应序列化器为:

class TaskSerializer(serializers.ModelSerializer):
    class Meta:
        model = Task
        fields = ('name','description','completed','text')

现在我的问题是我想在获取数据的同时验证模型的“名称”字段。例如,我可能会通过类似于 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 类中有一个叫做 'validate_(fieldname)' 的东西。但我希望在 Serializers.ModelSerializer 中使用它。(类似于 Django 中的自定义表单验证)

4

1 回答 1

10

您可以向序列化程序添加一个validate_name()方法,该方法将执行此验证。它应该返回经过验证的值或引发ValidationError.

为了检查用户是否输入了全名,我们将使用str.split()which 将返回字符串中的所有单词。如果没有。字符串中的单词数不大于 1,那么我们将引发 a 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
于 2015-11-16T17:23:37.463 回答