Проверка Django - избегание нескольких full_cleans () - PullRequest
0 голосов
/ 18 сентября 2019

Я новичок в Django, и после прочтения множества документов / руководств и материалов по поиску, я все еще немного озадачен лучшим практическим способом проверки.

Кажется, это лучшее место дляПроверка выполняется на уровне модели, чтобы гарантировать, что она всегда применяется, независимо от того, откуда поступают данные (например, интерфейс Django, некоторый сервер JS, API и т. д.).Если я переопределю метод Model save () в моей базовой модели для вызова full_clean (), то это будет лучшим способом гарантировать, что сохраненные данные всегда будут хорошими.

Однако я сталкиваюсь с различными проблемами сэто в моем проекте.Очевидным является то, что ModelForms в Django уже вызывают Model full_clean (), поэтому в этом случае я вызываю его дважды.Кроме того, существуют другие сложности, например:

  • , если существует метод уровня модели, который сохраняет составную модель, в которой есть другая модель (например, адрес внутри некоторой учетной записи), я могуне просто сохранить адрес, потому что учетная запись может не пройти проверку впоследствии.Поэтому мне действительно нужно сначала проверить обе модели, а затем сохранить их (сохранить транзакцию).Но затем мне нужно вызвать full_clean () для проверки, и он вызывается снова во время save (), делая это 3 раза, как сейчас.Это кажется довольно расточительным, особенно потому, что некоторые методы проверки попадают в базу данных (например, validate_unique).

Одна вещь, о которой я думал, - это сделать full_clean () умнее, то есть добавить некоторые функциональные возможности, чтобы проверить, если Модельбыл изменен с тех пор, как в прошлый раз он был очищен, и только потом запускается, но это кажется довольно сложным в том смысле, что для каждой модели может потребоваться много работы.

Любые предложения о том, как лучше обрабатыватьэто?Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Прочитав кучу других материалов в Интернете об этом, я пришел к тому же выводу, что и @zxzak.Это немного сбивает с толку, потому что некоторые люди советуют помещать вызовы валидации в Модель, чтобы гарантировать, что она всегда используется, но в целом, кажется, что консенсус заключается в том, что лучше помещать вызовы для вызова валидации в Forms и ModelForms.

Это немного нелогично для новичков Django, таких как я, потому что мы думаем о формах как о чем-то на уровне представления в сочетании с HTML сайта, но на самом деле их можно рассматривать как абстрактный промежуточный слой между уровнем модели ичто-то, что предоставляет данные для него (веб-сайт, API, импорт файлов).Поэтому, если по соглашению вы всегда используете Forms для передачи данных между входами и моделями, вы в значительной степени гарантируете, что проверка будет выполнена для ваших моделей.

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

Пока вы все делаете разумно и используете Forms, как описано выше, ваши данные должны быть в хорошем состоянии.Любые неверные данные, введенные бизнес-логикой за ее пределами и сохраненные непосредственно в модель без проверки, скорее всего будут плохими, а не недействительными, и в любом случае не будут проверяться валидацией и, скорее всего, будут обнаружены тестированием, а неввод данных произвольной формы с веб-сайта / api / import.

0 голосов
/ 19 сентября 2019

Вы можете попробовать различные решения, но у вас возникнут проблемы, потому что фреймворк просто не спроектирован таким образом.Например, если метод save вызывает full_clean и, следовательно, вызывает ValidationError, как вы гарантируете, что он обрабатывается везде (сериализаторы, администратор)?Кроме того, вы все равно можете вызвать update вместо сохранения и обойти проверку.

Я бы порекомендовал поместить логику проверки в метод clean и позволить ModelForm вызывать ее.Если вы используете django-rest-framework, поместите логику проверки в Serializer.Если вы обнаружите, что повторяете логику проверки, просто абстрагируйте ее и используйте повторно, где это необходимо. Убедитесь, что модель действительна при вызове save.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...