Как переопределить 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 не обновляются... Подскажите как правильно реализовать и гне ошибка?