一尘不染

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

json

我已经开始尝试使用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)

阅读 258

收藏
2020-07-27

共1个答案

一尘不染

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

第一个解决方案是覆盖.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。如果它不起作用,请尝试查找如何获得它。

2020-07-27