Я пытаюсь создать API для обновления имени и фамилии моего пользователя. API работает успешно, но база данных не обновляется, что является ожидаемым поведением
Я написал следующий API и пытаюсь передать ему запрос на исправление.
class UserSelfUpdateView(UpdateAPIView):
serializer_class = UserUpdateSerializer
permission_classes = [UserPermissions, ]
def update(self, request: Request, *args, **kwargs):
instance = User.objects.filter(id=self.request.user.id)
serializer = UserUpdateSerializer(instance, data=request.data,)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response({'success': True}, status=status.HTTP_200_OK)
Сериализатор для вышеуказанного запроса:
class UserUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields: ('id', 'first_name', 'last_name')
Формат, в котором я пытаюсь передать тело запроса:
{
"first_name": "A",
"last_name": "B"
}
и вот как определяется моя модель:
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email address'), unique=True)
first_name = models.CharField(_('first name'), max_length=30, blank=False)
last_name = models.CharField(_('last name'), max_length=30, blank=False)
date_joined = models.DateTimeField(_('date joined'), auto_now_add=True)
is_active = models.BooleanField(_('active'), default=True)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
def get_full_name(self):
'''
Returns the first_name plus the last_name, with a space in between.
'''
full_name = '%s %s' % (self.first_name, self.last_name)
return full_name.strip()
def get_short_name(self):
'''
Returns the short name for the user.
'''
return self.first_name
def email_user(self, subject, message, from_email=None, **kwargs):
'''
Sends an email to this User.
'''
send_mail(subject, message, from_email, [self.email], **kwargs)
При запуске кода с указателем отладки не происходит обновления базы данных, но отображается статус 200.
При запуске кода без указателя отладки отображается код состояния 500 и следующее сообщение об ошибке в ответ.
AssertionError at /user/me-edit ("Creating a ModelSerializer without either the 'fields' attribute or the 'exclude' attribute has been deprecated since 3.3.0, and is now disallowed. Add an explicit fields = 'all' to the UserUpdateSerializer serializer.",)
для обновления объекта используйте получать, а не фильтр
Спасибо @c.grey Это была единственная моя ошибка.
Но обратите внимание, что вам вообще не нужно делать запрос, потому что request.user — это уже объект пользователя.






Проблема заключается в сериализаторе и, конкретно, в этой части кода:
class Meta:
model = User
fields: ('id', 'first_name', 'last_name')
Поля также являются переменной, определяемой с помощью =, поэтому код должен выглядеть так:
class Meta:
model = User
fields = ('id', 'first_name', 'last_name')
Это поможет вам решить эту ошибку AssertionError.
Ошибка не соответствует указанному вами коду. Дважды проверьте, что вы не определяете другой
UserUpdateSerializer