我已经开始尝试使用Django REST框架。到目前为止,我已经成功地为我的对象创建了一个序列化程序,通过Javascript的$ .post()创建了发布视图,发布对象和返回对象。因此,现在我可以在JSON和Django模型对象之间进行适当的转换。
问题是我有一个对象数组[A1,A2,…,An]。现在,当我需要发布这样的数组时,我逐个对象地进行处理。是否有可能一次发布整个数组,并在Django视图中恢复对象数组?如果是这样,这里遵循的模式是什么?我想我可以定义一个新模型,该模型是当前模型的数组,为其创建一个序列化器,依此类推,但这似乎不太优雅。
下面是我的视图和序列化器:
#serializers.py class SearchRequestSerializer(serializers.ModelSerializer): def create(self): return SearchRequest(**self.validated_data) class Meta: model = SearchRequest #views.py @api_view(['POST']) def post_calculation(request): if request.method == 'POST': #JSON to serializer object serializer = SearchRequestSerializer(data=request.data, many=False) if (serializer.is_valid() == False): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) #create the Python object search_request = serializer.create() #-- I do some processing stuff with the search_request object here --- #object back to JSON serializer3 = SearchRequestSerializer(search_request, many=False) return Response(serializer3.data)
有两种解决方案来解决您的问题:
.create()
默认情况下,django rest框架假定您将其传递给单个对象。要考虑将其传递给对象列表的可能性,可以按以下方式重写它:
def create(self, request, pk=None, company_pk=None, project_pk=None): is_many = True if isinstance(request.data, list) else False serializer = self.get_serializer(data=request.data, many=is_many) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
现在,您的视图将处理POST数据中的单个对象以及对象列表。
POST
django-rest-framework-bulk提供上述功能以及其他功能(例如,批量更新)。您可以签出并确定它是否满足您的需求。
django-rest-framework-bulk
为了使其与基于函数的视图一起使用,方法是相似的:
@api_view(['POST']) def post_calculation(request): if request.method == 'POST': is_many = True if isinstance(request.data, list) else False # JSON to serializer object serializer = SearchRequestSerializer(data=request.data, many=is_many) if (serializer.is_valid() is False): # use `is False` syntax rather than `== False` in Python return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) serializer.save() #-- do some processing stuff here --- return Response(serializer.data)
不要.create()直接调用方法,.save()而是使用。另外,many=False在序列化程序上使用时,可以在下找到创建的实例serializer.instance。我不确定如何获取已创建实例的列表。您可以尝试相同的方法serializer.instance。如果它不起作用,请尝试查找如何获得它。
.save()
many=False
serializer.instance