1

我很熟悉我可以设置always_return_dataTrue让服务器返回序列化数据POSTPUT请求。但是有没有办法我可以专门要求在特定POST呼叫而不是所有POST/PUT呼叫中返回数据?

4

3 回答 3

2

您可以在或方法中always_return_data设置True并手动删除捆绑包中的所有数据,但这只会导致返回一个空的 JSON(或您喜欢的任何序列化)对象,这并不完全是一个空响应。dehydratealter_detail_data_to_serialize

想要的行为可能最明确的方法是覆盖<method>_listand<method>_detail函数并根据您的需要实现是否返回数据的决定。

这是一个示例,post_list它需要一个名为 GET-Parameterreturn_data来决定:

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)
于 2013-02-26T17:18:41.920 回答
1

我建议在您希望返回数据的帖子中添加一个额外的参数。如果参数存在于 post 变量中,则将所需的数据添加到 dehydrate 中的包中

于 2013-02-26T14:50:20.207 回答
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
于 2013-02-26T23:22:11.387 回答