mat*_*att 3 django validation django-rest-framework
我有一个模型,它使用Django REST Framework作为资源公开.我需要在相关端点上执行POST请求时手动创建对象,这就是我使用a 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 ??
Run Code Online (Sandbox Code Playgroud)
以下是您从mixins.CreateModelMixin类中获取的create方法的实现:
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)
Run Code Online (Sandbox Code Playgroud)
如您所见,它获取序列化程序,验证数据并从序列化程序验证的数据执行对象的创建.
如果需要手动控制对象的创建,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
Run Code Online (Sandbox Code Playgroud)