Django REST框架自定义字段验证 [英] Django REST Framework custom fields validation
问题描述
我正在尝试为模型创建自定义验证,以检查其 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屋!