我已经开始使用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)
答案 0 :(得分:2)
您的问题有两种解决方案:
.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
。如果它不起作用,请尝试找到如何获得它。