2016-09-02 33 views
1

我有一个使用Django REST框架作为资源公开的模型。 我需要在相关端点上执行POST请求时手动创建对象,这就是为什么我使用generics.ListCreateAPIView并覆盖create()方法。何时以及如何使用Django REST框架验证数据

不过,我需要检查在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

下面是您overrided的创建方法的实现,从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) 

正如你所看到的,它就会被序列化,验证数据和执行的创建对象来自序列化器验证的数据。

如果您需要手动控制对象的创建,perform_create是您需要覆盖的钩子,而不是create

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

谢谢塞巴斯蒂安,它的作品就像一个魅力! – matt

相关问题