我如何在POST上明确请求数据

时间:2013-02-26 12:30:37

标签: django tastypie

我很熟悉我可以将always_return_data设置为True,让服务器在POSTPUT请求中返回序列化数据。但有没有办法可以专门要求在特定POST来电时退回数据,而不是所有POST/PUT来电?

3 个答案:

答案 0 :(得分:2)

您可以将always_return_data设置为True,并在dehydratealter_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