Как сравнить два модельных поля друг с другом в Django? - PullRequest
1 голос
/ 23 февраля 2011

У меня есть эта Модель в моем файле Models.py. Я хочу сравнить «start_date» и «end_date», чтобы значение start_date никогда не было больше, чем end_date или Vice-versa. Как мне сделать эту проверку?

class Completion(models.Model):

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

1 Ответ

8 голосов
/ 23 февраля 2011

Я бы начал изучать модель проверки модели.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, вы получите обычные ошибки проверки в верхней части формы администратора. description

Наконец, это очень удобно. Вы можете использовать его где угодно.

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.
...