【发布时间】:2015-09-25 12:32:20
【问题描述】:
我正在尝试为模型创建自定义验证,以检查其 start_date 是否在其 end_date 之前,这几乎是不可能的。
我尝试过的东西:
内置 Django 验证器:无此检查
-
自己写,像这样:
def validate_date(self): if self.start_date < self.end_date: raise serializers.ValidationError("End date must be after start date.")
我已添加到 Serializer 类(然后是模型)中的那段代码,但它似乎没有在任一位置被调用。
我还发现了this 可能有用的代码,但我不知道如何集成到我的方法中——它似乎可以验证一个模型属性,但我需要检查两个属性。
我的模特:
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')
仅供参考,所有其他验证都有效!
我的序列化器:
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')
【问题讨论】:
标签: django django-rest-framework