Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django rest中创建函数以通过序列化程序传递JSON的更好方法是什么?_Python_Django_Django Rest Framework - Fatal编程技术网

Python 在django rest中创建函数以通过序列化程序传递JSON的更好方法是什么?

Python 在django rest中创建函数以通过序列化程序传递JSON的更好方法是什么?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在学习django rest框架,希望创建一个函数。在这个函数中,我需要用JSON传递一个列表,并通过序列化程序进行更新 为了寻求帮助,我在下面编写了一个代码示例 序列化程序示例: class GarageViewSet(viewsets.ModelViewSet): queryset = Garage.objects.all() serializer_class = GarageSerializer model = Garage class CarViewSet(

我正在学习django rest框架,希望创建一个函数。在这个函数中,我需要用JSON传递一个列表,并通过序列化程序进行更新

为了寻求帮助,我在下面编写了一个代码示例

序列化程序示例:

class GarageViewSet(viewsets.ModelViewSet):
    queryset = Garage.objects.all()
    serializer_class = GarageSerializer
    model = Garage

class CarViewSet(RestrictedQuerysetMixin, viewsets.ModelViewSet):
    queryset = Car.objects.all()
    serializer_class = CarSerializer
    model = Car
嗯。我需要通过车库序列器更新汽车清单。我是这样想的:

(示例视图)

尝试1:

在搜索和阅读文档时,我尝试了以下方法:

        @action(methods=['put'], detail=False)
        def update_car(self, request, *args, **kwargs):     
        if request.method == 'PUT':
            data = JSONParser().parse(request)
            serializer = CarSerializer(data=data, many=True)
            if serializer.is_valid():
                serializer.save()
                return JsonResponse(serializer.data)
            return JsonResponse(serializer.errors, status=400)
但我收到了这个错误:

non_field_errors:
["Expected a list of items but got type "dict"."]
{
    "detail": "Not found."
}
尝试2:

使用@fxgx,我也尝试过:

    def update_car(self, request):
        serializer = CarSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        validated_data = dict(list(serializer.validated_data.items()))
        queryset = Car.objects.update(**validated_data)
        return Response(CarSerializer(queryset, many=True).data)
但我收到了这个错误:

non_field_errors:
["Expected a list of items but got type "dict"."]
{
    "detail": "Not found."
}

DRF序列化程序不支持批量更新,必须将对象实例传递给序列化程序才能进行更新。您可以使用serializer序列化数据,使用验证数据更新对象,然后再次序列化对象以获取响应数据:

    class GarageViewSet(viewsets.ModelViewSet):
        queryset = Garage.objects.all()
        serializer_class = GarageSerializer
        model = Garage

        @action(detail=False, methods=['put'])
        def update_car(self, request):
            ...
            # Use partial=True for partial updates.
            serializer = CarSerializer(data=request.data)

            # Validate data.
            serializer.is_valid(raise_exception=True)

            # Get validated data in dictionary format.
            validated_data = dict(list(serializer.validated_data.items()))

            # Update objects
            quertset.update(**validated_data)

            ...
            return Response(CarSerializer(queryset, many=True).data)

嘿@fxgx。非常感谢。我试过像你这样的帮助。我现在将测试并发送反馈。我对您的示例有一些疑问。。。我更新我的问题。@Joey Fran您将此视图定义为详细信息,这意味着您正在车库对象上执行此操作。您确定为您的url提供了正确的车库id吗?我的url示例
路由器。注册(r“Garage”,GarageViewSet,base\u name=“Garage”)
。对不起,我没有给url提供id。给我收到的id
update\u car()得到了一个意外的关键字参数“pk”
好的,让我问一下。您是要更新所有汽车还是要更新属于车库的所有汽车?如果你想要第二个问题,请更新问题,把你的车库和汽车模型放在那里,这样我可以帮助你。