2016-09-02 12 views
1

Django REST Frameworkでリソースとして公開されているモデルがあります。 POST要求が関連エンドポイントで実行されたときにオブジェクトを手動で作成する必要があります。その理由はgenerics.ListCreateAPIViewを使用し、create()メソッドをオーバーライドします。Django REST Frameworkでデータを検証するタイミングと方法

私はPOSTリクエストのペイロードに与えられたパラメータは、既存の/ etc /よく形成されていることを確認する必要がありますが...

私はこの検証を行わなければならない、そしてそれがどのようにシリアライザと関連している

関連するシリアライザにvalidate()メソッドを書き込もうとしましたが、POSTリクエストでは呼び出されません。

class ProductOrderList(generics.ListCreateAPIView): 
    model = ProductOrder 
    serializer_class = ProductOrderSerializer 
    queryset = ProductOrder.objects.all() 

    def create(self, request, *args, **kwargs): 
      data = request.data 
      # Some code here to prepare the manual creation of a 'ProductOrder' from the data 
      # I would like the validation happens here (or even before) 
      po = ProductOrder.objects.create(...) 


class ProductOrderSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = ProductOrder 

    def validate(self, data): # Never called 
     # Is it the good place to write the validator ?? 

答えて

4

ここmixins.CreateModelMixinクラスから取られますが、オーバーライドの作成方法、の実装です:

def create(self, request, *args, **kwargs): 
    serializer = self.get_serializer(data=request.data) 
    serializer.is_valid(raise_exception=True) 
    self.perform_create(serializer) 
    headers = self.get_success_headers(serializer.data) 
    return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) 

あなたが見ることができるように、それは、シリアライザを取得したデータを検証し、の作成を行い、シリアライザの検証済みデータからのオブジェクト。

オブジェクトの作成を手動で制御する必要がある場合は、createではなく、perform_createがオーバーライドする必要のあるフックになります。

def perform_create(self, serializer): 
    # At this, the data is validated, you can do what you want 
    # by accessing serializer.validated_data 
+0

ありがとうSebastien、それは魅力のように動作します! – matt

関連する問題