数据库未在serializer.save()上更新

时间:2019-04-01 09:01:58

标签: python django django-rest-framework django-views django-serializer

我正在尝试构建一个用于更新用户名和姓氏的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状态代码并响应以下错误消息

  

/ user / me-edit上的AssertionError   (“自3.3.0开始,不推荐使用不具有'fields'属性或'exclude'属性的ModelSerializer创建,现在禁止使用。向UserUpdateSerializer序列化器添加显式字段=' all 。”,

1 个答案:

答案 0 :(得分:0)

问题存在于序列化程序中,具体而言,位于代码的这一部分中:

UIBackgroundModes

字段也是使用=定义的变量,因此代码应类似于:

Info.plist

这将帮助您解决AssertionError。