Django REST Framework PATCH在必填字段上失败

时间:2013-10-18 16:39:46

标签: python django rest django-rest-framework

我们正在创建一个需要允许用户更新记录的API。在许多情况下,如状态更新或名称更改,只会更改一个字段。这似乎是PATCH请求的合适用例场景。据我了解,这是一个“部分”更新。

我们已经实现了Django的REST框架并遇到了这个问题。对于诸如“AccountUser”之类的记录,我只想更改名称字段,因此我发送以下请求:     PATCH / api / users / 1 / HTTP / 1.1     主持人:localhost     X-CSRFToken:111122223333444455556666     Content-Type:application / json; charset = UTF-8     缓存控制:无缓存

{ "fullname": "John Doe" }

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

class AccountUserSerializer(serializers.ModelSerializer):
    account = serializers.PrimaryKeyRelatedField()

class Meta:
    model = AccountUser
    fields = ('id', 'account', 'fullname', ... )
    depth = 1

模型看起来像这样:

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

4 个答案:

答案 0 :(得分:1)

看起来您的经理不会过滤用户。我鼓励您使用pdb并在视图代码中设置断点,然后逐步查看其尝试创建新记录的原因。我可以保证我们使用PATCH一直完成部分更新,只发送几个字段进行更新而不会出现问题。

只有其他的想法是你发送一个触发验证错误的account(如null)的值,即使你列出的例子只显示发送{{1} } field。

答案 1 :(得分:1)

请参阅我的answer部分更新。您还可以看到drf docs和此docs

答案 2 :(得分:0)

就我而言,我所要做的就是将 required=False 添加到我的序列化程序字段的参数中。

这是一个新手错误,但我想我会在这里提到它,以防它对任何人有所帮助。

答案 3 :(得分:0)

您可以简单地在 serializers.py 中的 fields 变量之后添加这一行

class AccountUserSerializer(serializers.ModelSerializer):
    account = serializers.PrimaryKeyRelatedField()

class Meta:
    model = AccountUser
    fields = ('id', 'account', 'fullname', ... )
    depth = 1
    extra_kwargs = {
            'account' : {'required' : False}
        }