如何在django中比较两个模型字段?

时间:2011-02-23 17:38:14

标签: django django-models django-admin

我的Models.py文件中有这个模型。我想比较“start_date”和“end_date”,以便start_date值永远不会大于end_date或者反之亦然。我如何进行此验证?

class Completion(models.Model):

    start_date = models.DateField()
    end_date = models.DateField()
    batch = models.ForeignKey(Batch)
    topic = models.ForeignKey(Topic)

1 个答案:

答案 0 :(得分:8)

我开始进入模型验证框架。 HTTP:https://docs.djangoproject.com/en/2.0/ref/models/instances/#django.db.models.Model.clean

它被ModelForms使用,并且开始使用它非常有意义。

基本上,您在模型中定义clean()方法,放入验证逻辑,如果失败则引发ValidationError

class MyModel(models.Model):
    def clean(self):
        from django.core.exceptions import ValidationError
        if self.start_data > self.end_date:
            raise ValidationError('Start date cannot precede end date')


    def save(self, *args, **kwargs):
        # you can have regular model instance saves use this as well
        super(MyModel, self).save(*args, **kwargs)

此处的好处是,任何ModelForm(这意味着管理员网站将会调用full_clean(),而clean()会调用您的模型save_model而无需任何额外的工作

无需覆盖try: my_model.full_clean() except ValidationError, e: # Do something based on the errors contained in e.message_dict. # Display them to a user, or handle them programatically. ,您将在管理表单顶部获得常见的验证错误。 description

最后,它非常方便。你可以在任何地方使用它。

{{1}}