Что такое хороший дизайн сериализатора DRF для гибкости - PullRequest
0 голосов
/ 08 января 2019

Я читал много похожих тем и знаю, что есть несколько способов достичь цели, но мне интересно, есть ли у кого-нибудь мнение по этому вопросу.

Постановка задачи

Мое приложение имеет два основных типа пользователей. Клиенты и сотрудники. При извлечении данных из конечной точки клиенты нередко видят поля просмотра, чем сотрудники.

Кроме того, данные из представления списка обычно имеют меньше полей, чем поля извлечения.

Решение

Создать сериализатор для каждого метода, а также для каждого типа пользователя. Например, в конечной точке / orders у меня может быть до 8 различных сериализаторов

OrdersListStaffSerializer

OrdersListCustSerializer

OrdersRetrieveStaffSerializer .... и т. Д.

Тогда я могу просто выбрать правильный сериализатор для условия.

ПРОФИ

Кажется хорошей гибкостью в возможности точно контролировать, кто что видит, а также какие данные им разрешено записывать.

CONS

Такое ощущение, что может быть много дублирования усилий.

Отсутствует возможность более точного контроля данных в зависимости от разрешений.

Хотите знать, имел ли кто-либо опыт работы с этим типом конструкции, и работал ли он хорошо или стал слишком громоздким для обслуживания.

Спасибо!

1 Ответ

0 голосов
/ 08 января 2019

Это кажется очень сырым решением, но если вам нужен более точный способ отображения полей на основе разрешения пользователя, вы можете попробовать его.

Сначала заполните все поля, для которых требуется разрешение SerializerMethodField. В каждом методе проверяйте права пользователя и возвращайте значение поля, если у него есть доступ, в противном случае возвращайте заполнитель, например _Not_Permitted_

Наконец, в методе сериализатора to_representation удалите все поля со значением заполнителя _Not_Permitted_, которое вы определили ранее.

Как я уже сказал, это очень грубое решение, но оно дает вам полный контроль над тем, что видит каждый пользователь, вплоть до уровня поля

КСТАТИ , вы также можете просто пойти дальше и проверить разрешения в методе to_representation и не использовать SerializerMethodField s

...