我已经开始使用Django REST框架了.到目前为止,我成功地为我的对象创建了一个序列化器,创建了post视图,发布了对象并通过
Javascript的$.post()返回对象.所以现在我在JSON和Django模型对象之间进行了适当的转换.
问题是我有一个对象数组[A1,A2,…,An].现在,当我需要发布这样一个数组时,我按对象进行对象.是否有可能一次发布整个数组,并恢复Django 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)
最佳答案 您的问题有两种解决方案:
第一种解决方案是覆盖视图的.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.如果它不起作用,试着找到如何获得它.