Где должна происходить валидация данных? - Модель или сериализатор?
Я работаю над проектом, в котором проверка данных имеет решающее значение. Я заметил, что учебники размещают логику проверки либо в самой модели данных, либо в отдельном классе сериализатора. Это несоответствие приводит к путанице. Не могли бы вы разъяснить плюсы и минусы каждого подхода к проверке данных и рассказать, в каких случаях лучше использовать один из них, а в каких - другой?
Это субъективная тема.
Проверка данных имеет решающее значение - это означает, что в систему никогда не должны попадать испорченные или "плохие" данные.
Вопрос в следующем: Кто вводит данные в систему и какой поток данных вы используете в своем приложении?
Если у вас есть базовый rest web-service & public api & backend для frontend, который принимает данные от реальных пользователей, то очень важно написать валидацию на двух уровнях: входном (когда данные попадают в вашу систему через какой-то запрос) и на уровне данных (ограничения базы данных).
Например, представьте себе пример, в котором вы хотите, чтобы у ваших пользователей было какое-то уникальное свойство, привязанное к ним (пусть это будет номер телефона). Вы запрашиваете базу данных, чтобы проверить, существует ли этот номер, а затем продолжаете/отвечаете 400/Bad Request в вашем сериализаторе. Но что, если в вашем сериализаторе есть ошибка и данные попадают в систему? Тогда у вас есть уникальное ограничение на уровне базы данных, вы получите IntegrityError и увидите, что у вас нарушена валидация ввода.
Представьте, что у вас есть система другого типа, высоконагруженный сервис (data-logger), который хранит только то, что IoT-устройства постоянно транслируют ему (amqp, http и т.д.), и ваша цель - хранить только ВАЛИДНЫЕ данные и делать это с максимальной пропускной способностью. В этом случае нет смысла в сложном сериализаторе с понятным ответом, потому что вы будете запрашивать базу данных при каждом запросе и замедлять производительность вашего сервиса, просто реализуйте проверку данных на уровне БД (ограничения и т.д.) и обрабатывайте ошибки БД.
В основном все зависит от того, чем вы занимаетесь и какова ваша конечная цель. Надеюсь, это поможет.
Представьте, что у вас есть форма, в которую пользователи должны ввести свой адрес электронной почты.
Для проверки модели: Это как если бы у ворот с адресами электронной почты стоял охранник. Охранник проверяет, правильно ли он заполнен и уникален. Это хорошо подходит для базовых правил для одной модели.
Для проверки сериализатора: Это как более продвинутая система безопасности на воротах электронной почты. Он проверяет множество параметров, например, заканчивается ли письмо только на домене вашей компании (yourcompany.com). Хорошо подходит для сложных правил или повторного использования их для различных вещей (например, форм и вызовов API).
Какой выбор?
Простые правила, одна модель? Валидация модели - это хорошо. Сложные правила, нужна в разных местах? Лучше использовать валидацию сериализатора.