БД не обновляется в serializer.save()

Я пытаюсь создать 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.",)

Ошибка не соответствует указанному вами коду. Дважды проверьте, что вы не определяете другой UserUpdateSerializer

Linovia 01.04.2019 11:09

для обновления объекта используйте получать, а не фильтр

rahul.m 01.04.2019 11:19

Спасибо @c.grey Это была единственная моя ошибка.

VIBHOR GOYAL 01.04.2019 11:22

Но обратите внимание, что вам вообще не нужно делать запрос, потому что request.user — это уже объект пользователя.

Daniel Roseman 01.04.2019 21:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
687
1

Ответы 1

Проблема заключается в сериализаторе и, конкретно, в этой части кода:

class Meta:
    model = User
    fields: ('id', 'first_name', 'last_name')

Поля также являются переменной, определяемой с помощью =, поэтому код должен выглядеть так:

class Meta:
    model = User
    fields = ('id', 'first_name', 'last_name')

Это поможет вам решить эту ошибку AssertionError.

Другие вопросы по теме