Python 在django rest中创建函数以通过序列化程序传递JSON的更好方法是什么?
我正在学习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(
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。给我收到的idupdate\u car()得到了一个意外的关键字参数“pk”
好的,让我问一下。您是要更新所有汽车还是要更新属于车库的所有汽车?如果你想要第二个问题,请更新问题,把你的车库和汽车模型放在那里,这样我可以帮助你。