簡體   English   中英

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

[英]Django REST Framework PATCH fails on required fields

我們正在創建一個需要允許用戶更新記錄的 API。 在許多情況下,例如狀態更新或名稱更改,只有一個字段會更改。 這似乎是 PATCH 請求的合適用例場景。 據我了解,這是一個“部分”更新。

我們已經實現了 Django 的 REST 框架並遇到了這個問題。 對於諸如“AccountUser”之類的記錄,我只想更改名稱字段,因此我發送以下請求:PATCH /api/users/1/ HTTP/1.1 Host: localhost X-CSRFToken: 111122223333444455556666 Content-Type: application/json ;charset=UTF-8 緩存控制:無緩存

{ "fullname": "John Doe" }

該記錄顯然具有其他屬性,包括幾個“相關”字段,例如新記錄所需的“帳戶”。 提交請求時,響應是 400 錯誤,正文如下: { "account": [ "This field is required." ] } 用戶的序列化程序如下所示:

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

看起來您的經理沒有過濾用戶。 我鼓勵您使用 pdb 並在您的視圖代碼中設置一個斷點,然后逐步了解為什么它會嘗試創建新記錄。 我可以保證我們一直使用 PATCH 來完成部分更新,並且只發送幾個字段進行更新沒有問題。

唯一的想法是,即使您列出的示例僅顯示發送fullname名字段,您也知道如何發送觸發驗證錯誤的account值(如null )。

請參閱我關於部分更新的回答 你也可以看到 drf docs和 this one docs

我來這里是因為我遇到了類似的問題。 CREATE 很好,但 PATCH 不行。

由於 OP 不發布 ViewSet,如果他使用自定義 ViewSet,我會暫停,因此在覆蓋更新功能時我會出錯:

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

我的錯誤在於調用super() 缺少星號。 這解決了我的問題

        return super().update(request, *args, **kwargs)

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

這是一個新手錯誤,但我想我會在這里提到它,以防它對任何人有幫助。

您可以簡單地在 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}
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM