170 похожих чатов

В ModelViewSet обновляю запись таким образом. нужно чтобы сериализатор не

пропускал недопустимое значение role (на выбор три значения)
def perform_update(self, serializer):
user = get_object_or_404(CustomUser, username=self.kwargs.get('username'))
role = self.request.data.get('role') or user.role
serializer.is_valid(raise_exception=True)
serializer.save(role=role)
в сериализаторе поле role задаю так
role = serializers.ChoiceField(default='user', choices=ROLES, read_only=True, required=False)
но при сохранении записи с неверной ролью все проходит. как исправить чтоб не проходило?

12 ответов

23 просмотра

А что is_valid выводит?

Не выходи из комнаты.
А что is_valid выводит?

это если данные валидны вроде

Максим- Автор вопроса
Не выходи из комнаты.
А что is_valid выводит?

ничего. возможно дело в том что сериализатор не проверяет поле role т.к. оно read_only а сразу сохраняет его. как можно в def perform_update закинуть в сериализатор поле role на проверку?

эм, ну ты сам достаешь роль из пришедших данных и сам ее прокидываешь в save сериализатора

Максим- Автор вопроса
Nikolay Cherniy
эм, ну ты сам достаешь роль из пришедших данных и ...

а как сделать чтоб сериализатор не пропускал не корректное значение? в данном случае

Максим
а как сделать чтоб сериализатор не пропускал не ко...

ну пропускать поле через сериализатор, а не прокидывать его сразу в save, там оно просто считается провалидированным значением

Максим- Автор вопроса
Nikolay Cherniy
ну пропускать поле через сериализатор, а не прокид...

в функции perform_update(self, serializer) как это сделать не переопределяя serializer? или выход только к примеру такой serializer=CustomUserSerializer(data=self.request.data)

Максим
в функции perform_update(self, serializer) как это...

А почему ты используешь перформ апдейт?

Максим- Автор вопроса
Не выходи из комнаты.
А почему ты используешь перформ апдейт?

мне показалось что более удобно на этом этапе переопределить данные при сохрании patch методом. или как лучше сделать?

Максим
мне показалось что более удобно на этом этапе пере...

В апдейт нормально сделать, с флагом partial=True, если это патч

Не выходи из комнаты.
В апдейт нормально сделать, с флагом partial=True,...

Насколько я помню,перформ в основном нужен как раз когда нужно что-то докинуть в сейв, минуя валидацию

Максим- Автор вопроса
Не выходи из комнаты.
В апдейт нормально сделать, с флагом partial=True,...

не могу понять как на уровне модели или сериализатора сделать поле role c выбором и проверкой. в модели role = models.CharField(choices=ROLES, default='user', max_length=10) в сериализаторе либо не менять либо role = serializers.ChoiceField(default='user', choices=ROLES, required=False) во вьюхе не переопределяю сохранение этого поля. и оно не сохраняется. только дефолтное

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта