Как использовать full_clean() для проверки данных перед сохранением в Django 1.5 изящно?

Я думаю, что проверка модели Django немного неудобна для тех моделей, которые не используют встроенную ModelForm, хотя и не знают, почему.

Во-первых, full_clean() необходимо full_clean() вручную.

Обратите внимание, что full_clean() не будет вызываться автоматически при вызове метода save() моделей или в результате проверки ModelForm. В случае проверки ModelForm, Model.clean_fields(), Model.clean() и Model. validate_unique() все вызываются по отдельности. Вам нужно вызвать full_clean вручную, если вы хотите запустить одношаговую проверку модели для ваших собственных моделей, созданных вручную.

Во-вторых, validators используются во встроенной ModelForm.

Обратите внимание, что валидаторы не будут запускаться автоматически при сохранении модели, но если вы используете ModelForm, он будет запускать ваши валидаторы в любых полях, включенных в вашу форму.

Существуют большие требования, когда вам необходимо выполнить проверку данных перед сохранением данных в базах данных. И, очевидно, я бы предпочел сделать это в модели, а не в представлениях. Итак, есть ли хорошие идеи для реализации этого изящно в Django 1.5?

Ответ 1

Несмотря на то, что идея обеспечения проверки на уровне модели кажется правильной, Django не делает этого по умолчанию по разным причинам. За исключением некоторых проблем с обратной совместимостью, авторы, вероятно, не хотят поддерживать это, потому что они опасаются, что это может создать ложное чувство безопасности, когда на самом деле ваши данные не гарантируются всегда. Некоторые методы ORM (например, bulk_create или update) не вызывают save() и, следовательно, не могут проверить ваши модели. Другими словами, трудно гарантировать валидацию, поэтому они решили не притворяться.

Если вам это нужно для нескольких моделей, вы можете создать простой mixin, который переопределяет метод save() и вызывает full_clean() до super. Обратите внимание, что это может привести к тому, что валидация будет выполняться дважды в некоторых случаях, например, при использовании ModelForm. Это может быть не проблема, хотя, если ваши процедуры проверки являются побочными эффектами, бесплатными и дешевыми для запуска.

Для получения дополнительной информации см. следующие ответы: