Полевая проверка модели Django

Это зависит от шаблона. Некоторые вещи трудно сделать в Python: Singleton является примером. Вы заменяете этот шаблон другим, такой как, в случае Singleton, Borg.
Это весьма нормально для использования шаблонов разработки в Python - шаблон Итератора, например, интегрируется в синтаксис. Однако много вещей просто не сделаны как OO - или тяжелый шаблоном материал. Python сделан быть процедурным или функциональным, когда он лучше всего удовлетворяет задаче и OO также.
В целом, я просто сказал бы для использования лучшего суждения. Если кажется, что использование Альфа-Гаммы Шаблона разработки является излишеством и сверхсложностью, то это, вероятно. Если кажется, что шаблон идеально подходит для того, что Вы хотите, это, вероятно.

59
задан shylent 26 October 2009 в 13:27
поделиться

3 ответа

Django имеет систему проверки модели , действующую с версии 1.2.

В комментариях sebpiq говорит: «Хорошо, теперь есть место для проверки модели ... за исключением того, что он запускается только при использовании ModelForm! Таким образом, остается вопрос, когда необходимо обеспечить соблюдение валидации на уровне базы данных, что вы должны делать? Где вызывать full_clean? "

Это невозможно через Проверка на уровне Python, чтобы гарантировать соблюдение проверки на уровне базы данных. Наиболее близким вариантом, вероятно, является вызов full_clean в замещенном методе save . Это не делается по умолчанию, потому что это означает, что всем, кто вызывает этот метод сохранения, теперь лучше быть подготовленными к обнаружению и обработке ValidationError .

Но даже если ты сделаешь это, кто-то по-прежнему может обновлять экземпляры модели массово, используя queryset.update () , который обходит эту проверку. Django не может реализовать достаточно эффективный queryset.update () , который мог бы выполнять проверку на уровне Python для каждого обновленного объекта.

Единственный способ действительно гарантировать целостность на уровне базы данных - это через ограничения уровня базы данных; любая проверка, которую вы выполняете через ORM, требует, чтобы автор кода приложения знал, когда выполняется проверка (и обрабатывает сбои проверки).

Вот почему проверка модели по умолчанию применяется только в ModelForm - потому что в ModelForm уже существует очевидный способ обработки ValidationError .

Django не может реализовать достаточно эффективный queryset.update () , который мог бы выполнять проверку на уровне Python для каждого обновленного объекта.

Единственный способ действительно гарантировать целостность на уровне базы данных - это через ограничения уровня базы данных; любая проверка, которую вы выполняете через ORM, требует, чтобы автор кода приложения знал, когда выполняется проверка (и обрабатывает сбои проверки).

Вот почему проверка модели по умолчанию применяется только в ModelForm - потому что в ModelForm уже существует очевидный способ обработки ValidationError .

Django не может реализовать достаточно эффективный queryset.update () , который мог бы выполнять проверку на уровне Python для каждого обновленного объекта.

Единственный способ действительно гарантировать целостность на уровне базы данных - это через ограничения уровня базы данных; любая проверка, которую вы выполняете через ORM, требует, чтобы автор кода приложения знал, когда выполняется проверка (и обрабатывает сбои проверки).

Вот почему проверка модели по умолчанию применяется только в ModelForm - потому что в ModelForm уже существует очевидный способ обработки ValidationError .

63
ответ дан 24 November 2019 в 18:31
поделиться

Основная проблема заключается в том, что проверка должна выполняться на моделях. Это довольно давно обсуждалось в django (проверка с учетом модели поисковой формы в списке рассылки разработчиков). Это приводит либо к дублированию, либо к чему-то ускользает от проверки перед попаданием в базу данных.

Хотя это не затрагивает магистраль, Малкольм «решение проверки модели для бедняков» , вероятно, является самым чистым решением, чтобы избежать повторения. 1153990]

3
ответ дан 24 November 2019 в 18:31
поделиться

Если я вас "ясно" понимаю - вы должны переопределить функцию get_db_prep_save вместо to_python

1
ответ дан 24 November 2019 в 18:31
поделиться
Другие вопросы по тегам:

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