Как переопределить djoser.serializers и djoser.viewsets для коректной работы patch запроса на /users/me/ с кастомной моделью пользователя

Я создаю проект используя django rest framework для аутентификации пользователей используется библиотека djoser с переопределённой моделью пользователя:

    class CustomUser(AbstractUser):
    """Модель пользователей с расширенным функционалом."""
    username = None
    avatar = models.ImageField(
        upload_to='users/avatars/',
        blank=True,
        null=True,
        verbose_name='Фотография'
    )
    email = models.EmailField(unique=True, verbose_name='Электронная почта')
    birth_date = models.DateField(null=True, blank=True, verbose_name='Дата рождения')
    address = models.CharField(max_length=150, blank=True, verbose_name='Адрес')
    first_name = models.CharField(max_length=150, verbose_name='Имя')
    last_name  = models.CharField(max_length=150, verbose_name='Фамилия')
    hard_skills = models.ManyToManyField(
        HardSkill,
        related_name='owners',
        verbose_name='Профессиональные навыки'
    )

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name']

    class Meta:
        verbose_name = 'Пользователь'
        verbose_name_plural = 'Пользователи'

    def __str__(self):
        return self.email

так же я переопределил джосеровские сериализаторы:

class CustomUserSerializer(UserSerializer):
    age = serializers.SerializerMethodField()
    full_name = serializers.SerializerMethodField()
    hard_skills = serializers.SerializerMethodField(
        method_name='get_hard_skills'
    )


    class Meta(UserSerializer.Meta):
        model = CustomUser
        fields = (
            'id',
            'first_name',
            'last_name',
            'full_name',
            'avatar',
            'email',
            'birth_date',
            'age',
            'address',
            'hard_skills'
        )

    def update(self, instance, validated_data):
        hard_skills_data = validated_data.pop('hard_skills', None)
        instance = super().update(instance, validated_data)

        if hard_skills_data:
            instance.hard_skills.set(hard_skills_data)

        return instance


    def get_age(self, obj):
            if obj.birth_date:
                today = dt.date.today()
                age = today.year - obj.birth_date.year - ((today.month, today.day) < (obj.birth_date.month, obj.birth_date.day))
                return age
            return None

    def get_full_name(self, obj):
        return f"{obj.first_name} {obj.last_name}"

    def get_hard_skills(self, obj):
        user = self.context['request'].user
        return(
            user.hard_skills.values(
                'id',
                'name'
            )
        )


class CurrentCustomUserSerializer(CustomUserSerializer):
    pass


class CustomUserCreateSerializer(UserCreateSerializer):
    class Meta(UserCreateSerializer.Meta):
        model = CustomUser
        fields = (
            'id',
            'email',
            'first_name',
            'last_name',
            'password',
            'birth_date',
            'address',
            'avatar',
            'hard_skills'
        )

    extra_kwargs = {
        'email': {'required': True},
        'first_name': {'required': True},
        'last_name': {'required': True},
        'password': {'required': True, 'write_only': True},
    }

и Вьюсет:

class CustomUserViewSet(UserViewSet):
    serializer_class = CustomUserSerializer

    def get_object(self):
        return self.request.user

так же переопределил конфигурации джосера в settings:

DJOSER = {
        'USER_CREATE_PASSWORD_RETYPE': True,
        'SET_PASSWORD_RETYPE': True,
        'PASSWORD_RESET_CONFIRM_URL': '#/password/reset/confirm/{uid}/{token}',
        'USERNAME_RESET_CONFIRM_URL': '#/username/reset/confirm/{uid}/{token}',
        'ACTIVATION_URL': '#/activate/{uid}/{token}',
        'SERIALIZERS': {
            'user': 'api.users.serializers.CustomUserSerializer',
            'current_user': 'api.users.serializers.CurrentCustomUserSerializer',
            'user_create': 'api.users.serializers.CustomUserCreateSerializer',
        },
    }

но при отправке PATCH запроса на /users/me/ данные поля hard_skills не обновляются... Подскажите как правильно реализовать и гне ошибка?


Ответы (0 шт):