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

ans*_*hul 1 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)
Run Code Online (Sandbox Code Playgroud)

Yuj*_*ita 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)
Run Code Online (Sandbox Code Playgroud)

这里的好处是任何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.
Run Code Online (Sandbox Code Playgroud)