2013-10-18 16 views
7

ユーザーがレコードを更新できるようにするためのAPIを作成しています。多くの場合、ステータスの更新や名前の変更のように、1つのフィールドだけが変更されます。これは、PATCH要求に対する適切なユースケースのシナリオと思われます。私が理解しているように、これは部分的な更新です。Django REST Framework PATCHが必須フィールドで失敗する

私たちはDjangoのRESTフレームワークを実装し、この問題に取り組んでいます。 「AccountUser」などのレコードの場合は、名前欄のみを変更したいので、次のリクエストを送信します。 PATCH/api/users/1/HTTP/1.1 ホスト:localhost X-CSRFToken:111122223333444455556666 コンテンツタイプ:アプリケーション/ JSON;のcharset = UTF-8 のCache-Control:キャッシュなし

{ "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' 

私はここで間違って何かをやっているか、それを更新できることを期待することが間違っていますこのようにレコードの1つのフィールド。ありがとう!このコミュニティは揺れる!

EDIT: が要求 - 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

てみてください= 'account''を見ることができます。.. ' –

+0

を' Account'モデルの逆引き参照のためにのみだこと。 –

+0

ができあなたはあなたの 'AccountUserManager'を投稿していますか?マネージャは' pk = 1'でオブジェクトを返さないので、パッチコール( 'partial_update'を呼び出します)は新しいインスタンスを作成する必要があると考えます。 –

答えて

1

それはあなたの管理者がユーザーをフィルタリングしているようには見えません。私はpdbを使用し、ビューコードにブレークポイントを設定して、新しいレコードを作成しようとする理由を確認することをお勧めします。パッチを使用して部分的な更新を常に完了し、いくつかのフィールドを送信して問題なく更新できることを保証することができます。

のみ、他の考えはあなたには、いくつかの方法をaccountの値を送っているということである(nullのような)それはあなたが例にfullnameフィールドを送信するだけのショーをリストされているにもかかわらず、検証エラーをトリガます。

0

私のanswerの部分的な更新については、また、あなたは、models.ForeignKey(アカウント `でDRF docsと` related_nameを追加し、この1 docs

関連する問題