Добавление дополнительных ограничений в поля в Django

Итак, если вы ищете функцию из пакета car, это qqPlot, а не qqplot.

Можете ли вы попробовать qqPlot(lm(a~b)). Это вернет приведенный ниже сюжет.

Участок:

enter image description here

28
задан Paco 10 April 2015 в 15:13
поделиться

3 ответа

Я бы не стал вводить подобные ограничения в метод сохранения, это слишком поздно. Возникновение исключения не помогает пользователю, который неверно ввел данные, потому что это будет 500, и пользователь не получит форму с ошибками и т. Д.

Вы должны действительно проверить это в чистом методе Forms / ModelForms и вызвать ValidationError, поэтому form.is_valid() возвращает false и вы можете отправить ошибки в форме обратно пользователю для исправления.

Также обратите внимание, что начиная с версии 1.2, Django прошла проверку модели .

Это будет выглядеть примерно так:

class Foo(models.Model):
    #  ... model stuff...
    def clean(self):
        if self.start_date > self.end_date:
            raise ValidationError('Start date is after end date')
50
ответ дан stefanw 28 November 2019 в 02:41
поделиться

Как говорит @stefanw, удобнее для пользователя проверять чистый метод формы.

Этого достаточно, если вы уверены, что нет и никогда не будет другого способа изменить значение. Но поскольку вы редко можете быть в этом уверены, если согласованность базы данных важна, вы можете добавить еще одну проверку (в дополнение к форме), одну из:

  • Более простой и независимый от базы данных способ заключается в метод сохранения модели, как сказал @ umnik700. Обратите внимание, что это по-прежнему не мешает другим пользователям базы данных (другое приложение или интерфейс администратора) создавать несовместимое состояние.
  • Чтобы быть «полностью» уверенным, что база данных согласована, вы можете добавить ограничение уровня базы данных. Например. вы можете создать миграцию с помощью RunSQL и SQL, что-то вроде (не проверено):

    migrations.RunSQL('ALTER TABLE app_event ADD CONSTRAINT chronology CHECK (start_date > end_date);')
    

    (не проверено). Это может зависеть от базы данных, что, конечно, является недостатком.

В вашем примере это, вероятно, не стоит (неправильное время начала / окончания просто выглядит немного странно, но влияет только на одно несовместимое событие), и вам не нужны ручные изменения схемы. Но это полезно в тех случаях, когда последовательность важна.

РЕДАКТИРОВАТЬ : Вы также можете просто сохранить время начала и продолжительность вместо времени начала и окончания.

10
ответ дан Mark 28 November 2019 в 02:41
поделиться

Сделайте это внутри метода save вашей модели:

def save(self, *args, **kwargs):
    if(self.end_date > self.start_date):
        super(Foo, self).save(*args, **kwargs)
    else:
        raise Exception, "end_date should be greater than start_date" 
11
ответ дан 28 November 2019 в 02:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: