django - 如何制作可以处理创建 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"],
}
}
我怎样才能归档这个?
解决方案
您可以创建一个 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)
推荐阅读
- r - how to read superscripts from excel with out changing format into r-markdown pdf?
- python - 如何用熊猫附加两列?
- python - roc_auc_score 用于多类分类,AxisError:轴 1 超出了维度 1 数组的范围
- angular - 禁用的属性在按钮的角度不起作用
- python - python的panda中的合并排序如何按列对excel文件进行排序?
- text - 为什么我们不能在文本编辑器中使用内置文本框
- java - Spring 5.3.7 中 locatorFactorySelector 的任何替换
- javascript - 未达到事件侦听器内部的 JS for 循环
- sabre - 查询酒店/航班/游轮价格时,货币代码如何处理?
- postgresql - PG查询函数杀死AWS lambda