Я использую django и мне интересно, в каких случаях должна проходить валидация модели. Есть как минимум два варианта:
- Подтвердить в методе сохранения модели и вызвать IntegrityError или другое исключение, если бизнес-правила были нарушены
- Проверка данных с использованием форм и встроенных средств clean_ *
С одной точки зрения ответ очевиден: нужно использовать валидацию на основе форм. Это потому, что ORM - это ORM, а валидация - совершенно другая концепция. Взгляните на CharField: forms.CharField разрешает спецификацию min_length, но models.CharField этого не делает.
Хорошо, круто, но что, черт возьми, все эти функции проверки делают в django.db.models? Я могу указать, что CharField не может быть пустым, я могу использовать EmailField, FileField, проверка SlugField которых выполняется здесь, в python, а не в RDBMS. Кроме того, есть URLField, который проверяет существование URL-адреса, включающего некоторую действительно сложную логику.
С другой стороны, если у меня есть сущность, я хочу гарантировать, что она не будет сохранена в несогласованном состоянии, независимо от того, пришла она из формы или была изменена / создана некоторыми внутренними алгоритмами. У меня есть модель с полем имени, я ожидаю, что она должна быть длиннее, чем один символ. У меня также есть поля min_age и max_age, это не имеет большого смысла, если min_age> max_age. Так я должен проверить такие условия в методе сохранения?
Каковы лучшие практики проверки моделей?