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

Django 如何在POST上明确请求数据,django,tastypie,Django,Tastypie,我很熟悉,我可以将always_return_data设置为True,让服务器在POST和PUT请求中返回序列化数据。但是,有没有一种方法可以专门要求在特定的POST调用中返回数据,而不是在所有POST/PUT调用中返回数据?我建议在希望返回数据的POST中添加一个额外的参数。如果post变量中存在该参数,请将所需的数据添加到Deterheate中的bundle中,我建议在希望返回数据的post中添加一个额外的参数。如果post变量中存在该参数,则可以在Decreate中将所需数据添加到bund

我很熟悉,我可以将always_return_data设置为True,让服务器在POST和PUT请求中返回序列化数据。但是,有没有一种方法可以专门要求在特定的POST调用中返回数据,而不是在所有POST/PUT调用中返回数据?

我建议在希望返回数据的POST中添加一个额外的参数。如果post变量中存在该参数,请将所需的数据添加到Deterheate中的bundle中,我建议在希望返回数据的post中添加一个额外的参数。如果post变量中存在该参数,则可以在Decreate中将所需数据添加到bundle中,您可以将always_return_data设置为True,并在Decreate或alter_detail_data_to_Serialized方法中手动删除bundle中的所有数据,但这只会导致空JSON或您希望对象进行的任何序列化返回,这不完全是一个空响应

实现所需行为的最明确方式可能是重写_listand _detail函数,并根据需要执行是否返回数据的决策

下面是post_列表的一个示例,它使用名为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)
您可以将always_return_data设置为True,并在Deterhemate或alter_detail_data_to_Serialized方法中手动删除捆绑包中的所有数据,但这只会导致返回空JSON或任何您希望返回的序列化对象,而这并不是一个空响应

实现所需行为的最明确方式可能是重写_listand _detail函数,并根据需要执行是否返回数据的决策

下面是post_列表的一个示例,它使用名为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)

在我看来,最好的方法是覆盖脱水方法并设置always\u return\u 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

在我看来,最好的方法是覆盖脱水方法并设置always\u return\u 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