[英]Update multiple objects in django rest
我有博客,我会重新排序。 当我通过 postman 发送多个对象然后通过循环更新和保存时出现错误。
这些是我发送的对象->
[
{
"id":18,
"name": "a",
"is_active": true,
"author_name": 1,
"category": 1,
"tag": [1,2],
"order": 888888
},
{
"id": 17,
"name": "a",
"is_active": true,
"author_name": 1,
"category": 1,
"tag": [
1
],
"order": 999999999
}
]
但我有这个错误-> {“non_field_errors”:[“无效数据。需要字典,但得到了列表。” ] }
这是我的代码->
序列化程序.py
class BlogSerializer(serializers.ModelSerializer):
class Meta:
model = Blog
fields = ['id', 'name', 'is_active', 'author_name','category','tag','order']
extra_kwargs = {
'is_active': {'read_only': True},
'id':{"read_only":False}
}
视图.py
class UpdateOrder(generics.UpdateAPIView):
serializer_class = BlogSerializer
queryset = Blog.objects.all()
def put(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data, many=isinstance(request.data, list))
serializer.is_valid(raise_exception=True)
for i in serializer.validated_data:
blog = Blog.objects.get(id=i["id"])
serializer = BlogSerializer(instance=blog, data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
generics.UpdateAPIView
一次接受一个元素。 因此,为了扩展此行为以支持有效负载列表,您可以使用APIView
并更新put
方法,如下例所示:
from rest_framework.views import APIView, Response
from . import models, serializers
class BlogsAPI(APIView):
serializer_class = serializers.BlogSerializer
def get_queryset(self):
return models.Blog.objects.all()
def get(self, request):
serialized = self.serializer_class(self.get_queryset(), many=True)
return Response(serialized.data)
def _perform_update(self, elm):
tags = elm.pop('tag', [])
pk = models.Blog.objects.update(**elm)
db_instance = models.Blog.objects.filter(pk=pk).first()
db_instance.tag.clear()
db_instance.tag.add(*tags)
def put(self, request):
data = request.data
serialized = self.serializer_class(data=data, many=isinstance(data, list))
serialized.is_valid(raise_exception=True)
if isinstance(data, list): # Update multiple elements
for elm in serialized.validated_data:
self._perform_update(elm)
else: # Update one element
self._perform_update(serialized.validated_data)
return Response({'msg': 'updated'})
generics UpdateAPIView 中的Ovveride create 和get_serializer方法如下:
def get_serializer(self, *args, **kwargs):
return self.serializer_class(many=True)
并在创建方法中使用批量创建进行保存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.