我很熟悉我可以将always_return_data
设置为True
,让服务器在POST
和PUT
请求中返回序列化数据。但有没有办法可以专门要求在特定POST
来电时退回数据,而不是所有POST/PUT
来电?
答案 0 :(得分:2)
您可以将always_return_data
设置为True
,并在dehydrate
或alter_detail_data_to_serialize
方法中手动删除捆绑包中的所有数据,但这只会导致空JSON(或您喜欢的任何序列化)对象要返回,这不是一个空响应。
希望行为的最明确的方法是覆盖<method>_list
和<method>_detail
函数,并根据您的需要实现是否返回数据的决定。
以下是post_list
的示例,它采用名为return_data
的GET参数来决定:
def post_list(self, request, **kwargs):
deserialized = self.deserialize(request, request.raw_post_data, format=request.META.get('CONTENT_TYPE', 'application/json'))
deserialized = self.alter_deserialized_detail_data(request, deserialized)
bundle = self.build_bundle(data=dict_strip_unicode_keys(deserialized), request=request)
updated_bundle = self.obj_create(bundle, **self.remove_api_resource_names(kwargs))
location = self.get_resource_uri(updated_bundle)
return_data = updated_bundle.request.GET.get('return_data', None)
if not return_data is None:
updated_bundle = self.full_dehydrate(updated_bundle)
updated_bundle = self.alter_detail_data_to_serialize(request, updated_bundle)
return self.create_response(request, updated_bundle, response_class=http.HttpCreated, location=location)
else:
return http.HttpCreated(location=location)
答案 1 :(得分:1)
我建议在要返回数据的帖子上添加一个额外的参数。如果post变量中存在参数,则将所需数据添加到脱水
中的包中答案 2 :(得分:1)
在我看来,最好的方法是覆盖脱水方法并设置always_return_data = True:
class SomeModelResource(ModelResource):
class Meta:
queryset = SomeModel.objects.all()
always_return_data=True
def dehydrate(self, bundle):
if request.META['REQUEST_METHOD'] == 'POST' and\
request.POST.get('param', None)=='PARAM':
bundle.data = dict(id=bundle.obj.pk,
name=bundle.obj.name)
return bundle