@V-ampre

Как обрабатывается SerializerMethodField при put, patch запросах?

Например, я определяю сериалайзер для объекта "Компания" с которой связана учетная запись (объект User):

class CompanySerializerForOwner(serializers.ModelSerializer):
    """
    Сериалайзер для юр. лица для компании.
    Компания не может менять свою учетную запись.
    """
    username = serializers.SerializerMethodField()

    class Meta:
        model = models.Company
        fields = (
            'username',
            'inn',
            'ogrn',
            'city',
            'address',
            'email',
            'phone',
        )

    def get_username(self, obj):
        return obj.user.username

Естественно при попытке отправить запрос на обновление username patch методом оно не обновляется (ожидаемо). Но результат возвращается с кодом 200, а хотелось бы вернуть все таки предупреждение что изменять это поле запрещено. Использовать методы `validate_username` и `validate` тоже не получится, потомучто это поле отсутствует в validated_data.
Нашел вот такое решение о там делается это на уровне вью, а хотелось бы узнать есть ли возможность выполнить валидацию именно в сериалайзере...
  • Вопрос задан
  • 1932 просмотра
Пригласить эксперта
Ответы на вопрос 1
dunmaksim
@dunmaksim
Технический писатель
Если мы говорим про Django Rest Framework, то есть 2 решения.

1. Несколько сериализаторов, один для C, другой для R, третий для U. Потом во View переопределяем метод получения класса сериализатора в зависимости от метода запроса (POST, PUT, PATCH, GET):

def get_serializer_class(self):
    method = self.request.method
    if method == 'POST':
        return CompanyCreateSerializer
    if method == 'PATCH':
        return CompanyUpdateSerializer
    if method == 'GET':
        return CompanyReadSerializer


2. Создать сложный, запутанный сериализатор, наследник не ModelSerializer, а просто Serializer, и в нём переопределить поведение кучи методов (не рекомендую - устанете поддерживать потом).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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