【问题标题】:Django REST bulk post / post array of JSON objectsDjango REST 批量发布/发布 JSON 对象数组
【发布时间】:2016-09-16 17:17:20
【问题描述】:

我已经开始使用 Django REST 框架。到目前为止,我成功地为我的对象创建了一个序列化程序,通过 Javascript 的 $.post() 创建了 post 视图、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) 

【问题讨论】:

    标签: json django django-rest-framework


    【解决方案1】:

    您的问题有两种解决方案:

    第一个解决方案是覆盖视图的.create() 方法

    默认情况下,django rest 框架假定您传递给它一个对象。为了说明向它传递对象列表的可能性,您可以将其重写如下:

    def create(self, request, pk=None, company_pk=None, project_pk=None):
        is_many = isinstance(request.data, list)
    
        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 = isinstance(request.data, list)
            
            # JSON to serializer object
            serializer = SearchRequestSerializer(data=request.data, many=is_many)
            if not serializer.is_valid():
                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。如果它不起作用,请尝试查找如何获取它。

    【讨论】:

    • 谢谢。我认为这适用于基于类的视图。是否也有基于函数的视图的方法?...
    • @Botond 你能分享一下你基于函数的视图吗?
    • @Botond 基本上,当您在基于功能的视图中调用序列化程序时,如果您的request.data 中有一个列表,请将many=True 传递给您的序列化程序,它应该可以解决问题
    • 哦,我明白了...所以我可以从 JS post() 提交一个 JSON 数组吗?
    • @Botond 是的,你可以
    猜你喜欢
    • 2023-04-03
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 2016-11-29
    相关资源
    最近更新 更多