Django REST批量发布/发布JSON对象数组

我已经开始使用Django REST框架了.到目前为止,我成功地为我的对象创建了一个序列化器,创建了post视图,发布了对象并通过
Javascript的$.post()返回对象.所以现在我在JSON和Django模型对象之间进行了适当的转换.

问题是我有一个对象数组[A1,A2,…,An].现在,当我需要发布这样一个数组时,我按对象进行对象.是否有可能一次发布整个数组,并恢复Django View中的一组对象?如果是这样,这里的模式是什么?我想我可以定义一个新模型,它是我当前模型的数组,为它创建一个序列化器等等,但这似乎并不太优雅.

以下是我的视图和序列化程序:

#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数据中的单个对象以及对象列表.

第二种解决方案是使用第三方软件包

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.如果它不起作用,试着找到如何获得它.

点赞