Django REST批量发布/发布JSON对象数组 [英] Django REST bulk post / post array of JSON objects

查看:181
本文介绍了Django REST批量发布/发布JSON对象数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have started to play around with the Django REST framework. So far I succeeded in creating a serializer for my object, creating the post view, post objects and return objects via Javascript's $.post(). So right now I have a proper conversion between my JSONs and Django model objects.

问题是我有一个对象数组[A1,A2,...,An].现在,当我需要发布这样的数组时,我逐个对象地进行处理.是否可以一次发布整个数组,并在Django视图中恢复对象数组?如果是这样,这里遵循的模式是什么?我想我可以定义一个新模型,该模型是当前模型的数组,为它创建一个序列化器,依此类推,但这似乎不太优雅.

The problem is that I have an array of objects [A1, A2, ..., An]. Right now when I need to post such an array I do it object by object. Is there any possibility to post the whole array at once, and recover an array of objects inside my Django View? If so, what is the pattern to follow here? I guess I could define a new model which is an array of my current model, create a serializer for it, etc., but this does not seem too elegant.

下面是我的视图和序列化器:

Below are my view and serializer:

#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) 

推荐答案

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

There are two solutions to your problem:

默认情况下,django rest框架假定您将其传递给单个对象.要考虑传递给它的对象列表的可能性,您可以按如下方式重写它:

By default, django rest framework assumes you are passing it a single object. To account for the possibility to pass it a list of objects you might rewrite it as follows:

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

Now your view will handle both single objects in POST data as well as a list of objects.

django-rest-framework-bulk 提供了上述功能以及其他功能(例如,批量更新).您可以检查一下并确定它是否满足您的需求.

django-rest-framework-bulk provides the above functionality plus additional features (e.g. bulk update). You can check it out and decide whether it fits your needs.

为了使其与基于函数的视图一起使用,方法是相似的:

In order to get it to work with your function based view, the approach is similar:

@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.如果它不起作用,请尝试查找如何获得它.

Do not call .create() method directly, use .save() instead. Also, when using many=False on serializer, the created instance is available under serializer.instance. I am not sure how to obtain the list of created instances though. You can try the same serializer.instance. If it doesn't work, try to find how to get it.

这篇关于Django REST批量发布/发布JSON对象数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆