gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:00:07 25 4
gpt4 key购买 nike

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

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

下面是我的 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)

最佳答案

有两种解决方案来解决您的问题:
第一个解决方案是覆盖 View 的.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)
现在,您的 View 将处理 POST数据中的单个对象以及对象列表。
第二种解决方案是使用第三方程序包
django-rest-framework-bulk 提供上述功能以及其他功能(例如批量更新)。您可以检查出来并确定它是否符合您的需求。
更新:基于函数的 View 的解决方案
为了使其与基于函数的 View 一起使用,方法是相似的:
@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 (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。如果它不起作用,请尝试查找如何获得它。

关于json - Django REST批量发布/发布JSON对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37329771/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com