Django REST Framework修补程序在必需字段上失败

2024-09-30 02:33:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我们正在创建一个需要允许用户更新记录的API。在许多情况下,例如状态更新或名称更改,只有一个字段会更改。对于补丁请求来说,这似乎是一个合适的用例场景。据我所知,这是一个'部分'更新。在

我们已经实现了Django的REST框架并遇到了这个问题。对于“AccountUser”这样的记录,我只想更改名称字段,因此我发送以下请求: 补丁/api/users/1/HTTP/1.1 主机:本地主机 X-CSRF令牌:1111222233334455556666 内容类型:application/json;字符集=UTF-8 缓存控制:无缓存

{ "fullname": "John Doe" }

显然,该记录还具有其他属性,包括几个“相关”字段,例如新记录所需的“帐户”。提交请求时,响应为400错误,正文如下: {“account”:[“此字段是必需的。”]} 用户的序列化程序如下所示:

^{pr2}$

模型如下:

class AccountUser(models.Model):
    ''' Account User'''
    fullname = models.CharField(max_length=200,
        null=True,blank=True)
    account = models.ForeignKey(Account,
        on_delete=models.PROTECT
        )

    objects = AccountUserManager()

    def __unicode__(self):
        return self.email

    class Meta:
        db_table = 'accounts_account_user'

我是在这里做错了什么,还是期望以这种方式更新记录上的单个字段是错误的。谢谢!这个社区太棒了!在

编辑: 请求-AccountUserManager:

class AccountUserManager(BaseUserManager):

    def create_user(self, email, account_name):
        username = hash_email_into_username(email)
        ...
        account = Account.objects.get(name=account_name)
        account_user = AccountUser(email=email,user=user,account=account)
        account_user.save()
        return account_user

Tags: 用户nameself名称modelsemail错误记录
3条回答

看起来你的经理并没有过滤用户。我鼓励您使用pdb并在视图代码中设置断点,然后逐步了解它为什么要尝试创建新记录。我可以保证我们一直使用补丁来完成部分更新,并且只发送一些字段来更新而没有问题。在

唯一的另一个想法是,您知道如何发送account(如null)的值,该值会触发验证错误,即使您列出的示例只显示了发送fullname字段。在

我来这里是因为我遇到了类似的问题。创建是好的,但补丁不是

因为OP不发布视图集,如果他使用自定义视图集,我将挂起,我在重写update函数时出错:

class MyViewSet(ModelViewSet):
    def update(self, request, *args, **kwargs):
        // Do some checking
        return super().update(request, args, kwargs)

我的错误在于调用super()。缺少星号。这解决了我的问题

^{pr2}$

有关部分更新,请参阅我的answer。您还可以看到drfdocs和这个docs

相关问题 更多 >

    热门问题