Django REST框架自定义字段验证 [英] Django REST Framework custom fields validation

查看:128
本文介绍了Django REST框架自定义字段验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为模型创建自定义验证,以检查其 start_date 是否在其 end_date 之前,

I am trying to create custom validation for a model, to check that its start_date is before its end_date and it is proving near impossible.

我尝试过的东西:


  • 内置的Django验证器:没有检查这个

  • built-in Django validators: none check for this

写我自己的,像这样:

def validate_date(self):
   if self.start_date < self.end_date:
        raise serializers.ValidationError("End date must be after start date.")


我已经添加到Serializer类(然后是模型)的代码位,但似乎没有在任一位置调用。

That bit of code I have added to the Serializer class (and then the model), but it does not seem to get called in either location.

我还发现这个

I also found this bit of code that might be of use, but I don't know how to integrate in my method- it seems that it would work to validate one model attribute, but I need to check between two attributes.

我的模型:

class MyModel(models.Model):

    created = models.DateTimeField(auto_now_add=True)
    relation_model = models.ForeignKey(RelationModel, related_name="mymodels")
    priority = models.IntegerField(
        validators = [validators.MinValueValidator(0), validators.MaxValueValidator(100)])
    start_date = models.DateField()
end_date = models.DateField()

    @property
    def is_active(self):
        today = datetime.date.today()
        return (today >= self.start_date) and (today <= self.end_date)

    def __unicode__(self):
        ...

    class Meta:
        unique_together = ('relation_model', 'priority', 'start_date', 'end_date')

Fyi,所有其他验证工作!

Fyi, all the other validations work!

我的序列化器:

class MyModelSerializer(serializers.ModelSerializer):

    relation_model = RelationModelSerializer
    is_active = serializers.Field(source='is_active')

    def validate_date(self):
        if self.start_date > self.end_date:
            raise serializers.ValidationError("End date must be after start date.")   

    class Meta:
        model = MyModel
        fields = (
            'id', 'relation_model', 'priority', 'start_date', 'end_date', 'is_active'
        )

我的观点:

class MyModelList(generics.ListCreateAPIView):
    permission_classes = (IsAdminUser,)
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    ordering = ('priority')


推荐答案

您应该使用对象广泛验证( validate())因为 validate_date 将永远不会被调用,因为 date 不是序列化程序中的一个字段。 从文档

You should use an object wide validation (validate()), since validate_date will never be called since date is not a field on the serializer. From the documentation:

class MySerializer(serializers.ModelSerializer):
    def validate(self, data):
        """
        Check that the start is before the stop.
        """
        if data['start_date'] > data['end_date']:
            raise serializers.ValidationError("finish must occur after start")
        return data

您还可以在模型上添加一个干净的方法:

You could also add a clean method on the model:

class MyModel(models.Model):
    start_date = models.DateField()
    end_date = models.DateField()
    def clean(self):
        if self.end_date < self.start_date:
            raise ValidationError("End date must be after start date.")

这篇关于Django REST框架自定义字段验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆