8

ユーザーがレコードを更新できるようにする必要がある API を作成しています。多くの場合、ステータスの更新や名前の変更など、変更されるフィールドは 1 つだけです。これは、PATCH リクエストの適切なユース ケース シナリオのようです。私が理解しているように、これは「部分的な」更新です。

Django の REST フレームワークを実装したところ、この問題が発生しました。「AccountUser」などのレコードの場合、名前フィールドのみを変更したいので、次のリクエストを送信します: PATCH /api/users/1/ HTTP/1.1 Host: localhost X-CSRFToken: 11112222333444455556666 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
4

5 に答える 5

1

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

他の考えは、リストされている例では フィールドの送信のみを示しているにもかかわらず、検証エラーをトリガーしているaccount(のような) の値を送信する方法であるということです。nullfullname

于 2013-10-19T01:19:20.917 に答える
1

部分的な更新に関する私の回答をご覧ください。また、drf docsと this one docsを見ることができます

于 2016-07-12T14:52:06.427 に答える
0

私の場合はrequired=False、シリアライザ フィールドの引数に追加するだけで済みました。

確かに初心者の間違いですが、誰かに役立つ場合に備えて、ここで言及したいと思いました。

于 2021-03-04T05:50:53.967 に答える