【问题标题】:When and how to validate data with Django REST Framework何时以及如何使用 Django REST 框架验证数据
【发布时间】:2017-01-10 12:03:44
【问题描述】:

我有一个模型,它通过 Django REST 框架作为资源公开。 当在相关端点上执行 POST 请求时,我需要手动创建对象,这就是我使用 generics.ListCreateAPIView 并覆盖 create() 方法的原因。

但是我需要检查 POST 请求的有效负载中给出的参数是否格式正确/现有/等...

我应该在哪里执行此验证,它与序列化程序有什么关系?

我尝试在相关的 Serializer 中编写一个 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 ??

【问题讨论】:

    标签: django validation django-rest-framework


    【解决方案1】:

    以下是您重写的 create 方法的实现,取自 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
    

    【讨论】:

      猜你喜欢
      • 2019-02-09
      • 2015-08-18
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 2016-12-25
      • 2017-08-02
      • 2013-06-29
      相关资源
      最近更新 更多