首页 > 解决方案 > 如何制作可以处理创建 API 端点的嵌套发布数据的自定义序列化程序?

问题描述

由于独特的业务需求,我必须自定义 Create API 端点。django-rest-framework 中的默认行为是这样的。

class Customer(models.Model):
    fieldA = models.IntegerField(null=True, blank=True)
    fieldB = models.CharField(max_length=5, blank=True)
    ... ...

class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = '__all__'

class CustomerListCreateAPIView(generics.ListCreateAPIView):
    queryset = Customer.objects.all()
    serializer_class = CustomerSerializer

发布数据

{
    fieldA: 1,
    fieldB: 'some string'
}

它以 Created 状态发送响应

{
    id: 1,
    fieldA: 1,
    fieldB: 'some string'
}

但是,我想发布带有嵌套数据的数据并验证

{
    "customer": {
        "fieldA": 1,
        "fieldB": "some string"
    }
}

预期的响应数据应该是

{
    "customer": {
        "id": 1,
        "fieldA": 1,
        "fieldB": "some string"
    }
}

验证也应该显示嵌套的错误消息

{
    "customer": "customer field is required"
}

{
    "customer": {
        "fieldA": ["filedA is required"],
    }
}

我怎样才能归档这个?

标签: djangodjango-rest-framework

解决方案


您可以创建一个 ApiView 并通过迭代来验证每个数据。如果所有数据都有效,则创建对象。

例子:



class CustomerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Customer
        fields = '__all__'

class CustomerListCreateAPIView(APIView):
    def post(self, request, *args, **kwargs):
        customers = request.data.get('customer', None)
        for customer in customers:
            validated_data = CustomerSerializer(data=customer)
            # if invalid Raise Validation error 
        objects = []
        for customer in customers:
            validated_data = CustomerSerializer(data=customer)
            customer = Customer.objects.create(validated_data)
            objects.append(customer.id)

        return Response(
            CustomerSerializer(Customer.objects.filter(id__in=objects), many=True).data)
    

推荐阅读