2013-10-18 45 views
7

我們正在創建一個需要允許用戶更新記錄的API。在許多情況下,如狀態更新或名稱更改,只有一個字段會更改。對於PATCH請求,這似乎是一個合適的用例場景。據我所知,這是一個'部分'更新。Django REST Framework PATCH在所需字段上失敗

我們已經實現了Django的REST框架並且遇到了這個問題。對於諸如「AccountUser」的記錄,我只想更改名稱字段,因此我發送以下請求: PATCH/api/users/1/HTTP/1.1 主機:localhost X-CSRFToken:111122223333444455556666 Content-Type :應用/ JSON;字符集= 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 
+0

嘗試添加'related_name ='account'',..' –

+0

這隻能對'Account'模型反向查找。 –

+0

能你發佈了'AccountUserManager'?我猜測問題是管理員沒有在'pk = 1'返回對象,所以你的補丁調用(調用'partial_update')認爲它需要創建一個新的實例。 –

回答

1

它看起來並不像你的經理是過濾用戶。我鼓勵你使用pdb並在你的視圖代碼中設置一個斷點,並逐步瞭解它試圖創建新記錄的原因。我可以保證我們使用PATCH來始終完成部分更新,只發送幾個字段進行更新而沒有問題。

只有其他的想法是,你一些如何爲account發送的值(如null)這是觸發即使你列舉示例僅顯示發送fullname場驗證錯誤。

0

查看我的answer關於部分更新。你還可以看到在`models.ForeignKey(帳戶DRF docs這一個docs

相關問題