简体   繁体   English

更新 django rest 中的多个对象

[英]Update multiple objects in django rest

I have blogs and I do reorder.我有博客,我会重新排序。 When I send multiple objects by postman and then update and save by loop I get an error.当我通过 postman 发送多个对象然后通过循环更新和保存时出现错误。

These are the objects of what i send ->这些是我发送的对象->

[

    {
            "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
        }
]

but i have this error -> { "non_field_errors": [ "Invalid data. Expected a dictionary, but got list."但我有这个错误-> {“non_field_errors”:[“无效数据。需要字典,但得到了列表。” ] } ] }

this is my code- >这是我的代码->

serializer.py序列化程序.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}
        }

view.py视图.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()

It's because you are passing List as payload.这是因为您将 List 作为有效负载传递。 Change List to Dictionary ie: [] to {}将列表更改为字典,即:[] 到 {}

Few suggestions(Not related to the error you are facing):一些建议(与您面临的错误无关):

  1. Override create method in serializer itself.重写序列化程序本身的 create 方法。 For reference: Stackoverflow供参考: 堆栈溢出
  2. Use bulk_create instead of looping.使用 bulk_create 而不是循环。 Django Documentation Django 文档

generics.UpdateAPIView accepts one element at once. generics.UpdateAPIView一次接受一个元素。 So, in order to extend this behaviour to support a list of payload you can use APIView and update the put method like this example:因此,为了扩展此行为以支持有效负载列表,您可以使用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'})

Ovveride create and get_serializer method in generics UpdateAPIView like this: generics UpdateAPIView 中的Ovveride create 和get_serializer方法如下:

def get_serializer(self, *args, **kwargs):
        return self.serializer_class(many=True)

and save using bulk create in create method.并在创建方法中使用批量创建进行保存。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM