当前位置: 首页 > 面试题库 >

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

东方富
2023-03-14
问题内容

我已经开始尝试使用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数据中的单个对象以及对象列表。

第二种解决方案是使用第三方程序包

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



 类似资料:
  • 我用的是Kafka普勒。send()方法将记录发布到Kafka。这是一种异步方法。我的申请将向Kafka发布大约2万张唱片。在成功发送大约10k条记录后,我多次收到超时异常。我增加了一批。大小和逗留。ms减少了问题,但有时我仍然会遇到超时异常。有没有办法一次只发送10k条记录,等待它们完成,然后再发送下一批记录??我不想通过使用send使其同步。get()因为这会让它变得非常慢。这是我得到的例外。

  • 问题内容: 我正在尝试将JSON发布到WCF服务。json对象包含一个数组。我想知道如何正确绑定到我的数据合同。如果有人可以在这里给我指点,我将不胜感激。目前,我的购物车对象为null 我的服务界面如下所示: 我的客户电话如下 客户电话 我的JSON看起来像这样 问题答案: Fiddler对WCF REST方法的原始请求应如下所示: JSON中的响应如下所示:

  • 问题内容: 我正在尝试使用RestSharp发布以下JSON: 我想我已经接近了,但是我似乎在为 SecurityQuestion 苦苦挣扎(API抛出错误,表明缺少参数,但没有说明是哪个参数) 这是我到目前为止的代码: 我的安全问题类如下所示: 谁能告诉我我在做什么错?还有其他方法可以发布安全性问题对象吗? 非常感谢。 问题答案: 您需要在标题中指定content-type: 还根据方法添加到P

  • 我正在做一个项目,我请求一个api发布一个项目的详细信息。下面是我试图使用HttpRequest插入body itemstr的代码 这是我的newItem类 我试图将itemStr作为一个主体发布到本地运行的restful API。我可以使用GET请求检索,但不能发布。

  • 我需要以这种格式发布一个对象: 我试过: 但是服务器返回了一个错误的请求。我认为数据的格式无效。 如何更改代码以将数据转换为正确的格式? 谢谢你!

  • 问题内容: 我正在使用Symfony 2开发一个项目,我已经建立了一个捆绑包来处理我的所有数据库服务,这些服务来回传递JSON数据。 我的问题/问题: 是否可以发布简单的JSON对象?目前,我通过给对象起一个名字来欺骗我的ajax调用的普通表单帖子,如果我不给它起一个名字,我似乎无法从Symfony请求对象中获取数据。 我希望能够使用一个服务包来处理来自AJAX调用或常规Symfony形式的数据。