2

ここでは:http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset "ModelViewSetクラスによって提供されるアクションは、.list()、.retrieve()、.create()、.update()、.partial_update()、および.destroy()です。Viewsets `create()`と `update()`とシリアライザ `create()`と `update()`の違いは何ですか?

ここにはhttp://www.django-rest-framework.org/api-guide/serializers/#modelserializerと書かれています。「ModelSerializerクラスは、通常のシリアライザクラスと同じですが、.create()と.update()の単純なデフォルト実装が含まれています。ビューセットUserViewSetルータuser及びシリアライザUserSerializerがあると仮定すると

1)。 POST/user/に送信した場合はUserViewSetcreate()またはUserSerializercreate()を呼び出しますか?

2)UserViewSetがこの権限を持っていると仮定します。私は/user/POSTを送信する場合

class NoCreate(permissions.BasePermission): 
    """ 
    No one can create this object. 
    """ 
    message = 'You do not have permission to complete the action you are trying to perform.' 

    def has_permission(self, request, view): 
     if view.action == "create": 
      return False 
     return True 

UserSerializerさんはcreate()まだ呼び出されますでしょうか?

答えて

2

1)ビューセットのユーザービューセットとルーターユーザーとシリアライザUserSerializerがあるとします。/user /にPOSTを送信した場合、UserViewSetのcreate()またはUserSerializerのcreate()が呼び出されますか?

両方が呼び出されます。ビューのcreateはシリアライザを取得し、提供されたデータが有効であることを確認し、シリアライザのsaveを呼び出してレスポンスを生成します。シリアライザのcreateは実際にインスタンスの作成を実行します - つまり、データベースに書き込みます。

/user /にPOSTを送信すると、UserSerializerのcreate()が呼び出されますか?

許可がビューセットに設定されている場合は、いいえです。

class UserViewSet(mixins.RetrieveModelMixin, 
        mixins.UpdateModelMixin, 
        mixins.DestroyModelMixin, 
        mixins.ListModelMixin, 
        GenericViewSet): 

が作成以外のすべてのアクションが含まれます:あなたは任意の生成を防止したい場合は、チューニングModelViewSetを細かくする必要があります。

1

ビューセットの.create()および.update()メソッドは、要求が行われたときに実行されるアクションです。 POSTメソッドのリクエストは、PUTメソッドまたはPATCHのリクエストが、ビューセットの.update()メソッドを呼び出すため、ViewSetの.create()メソッドを呼び出します。

シリアライザの.save()メソッドを呼び出すことによって、シリアライザの.create()および.update()メソッドが実行されます。

シリアライザクラスをインスタンス化する際に、既存のインスタンスが渡された場合に応じて、既存のインスタンスを新しいインスタンスを作成し、または更新するか.save()を呼び出す:

# .save() will create a new instance. 
serializer = CommentSerializer(data=data) 

# .save() will update the existing `comment` instance. 
serializer = CommentSerializer(comment, data=data) 

は詳細についてはSaving Instances documentationを参照してください。

関連する問題