【问题标题】:Tastypie -- How to make obj_create send the newly created entity back?Tastypie -- 如何让 obj_create 将新创建的实体发回?
【发布时间】:2012-10-06 19:42:53
【问题描述】:

我正在发送一个 POST,它创建一个新的简单 Resource(不是 ModelResource),并且有效。

我的问题是如何将创建的资源的 bundle 属性返回到 ajax 响应?

这是资源示例:

class MyResource(Resource):
    x = fields.CharField(attribute='x')
    y = fields.CharField(attribute='y')

    class Meta:
        resource_name = 'myresource'
        object_class = XYObject
        authorization   = Authorization()

    def obj_create(self, bundle, request=None, **kwargs):
        x = bundle.data["x"]
        x = bundle.data["y"]
        bundle.obj = XYObject(x, y)
        return bundle

这是 POST 请求

$.ajax({
               type: "POST",
               url: '/api/v1/myresource/',
               contentType: 'application/json',
               data: data,
               dataType: 'json',
               processData: false,
               success: function(response)
               {
                //get my resource here
               },
               error: function(response){
                   $("#messages").show('error');
                 }
               });

【问题讨论】:

    标签: ajax django tastypie


    【解决方案1】:

    Tastypie 使用post_list(1) 方法。该方法调用您的obj_create 方法。然后它返回一个201 CreatedHTTP 响应,并设置了 Location 标头。因此,长话短说,您应该检查 API 调用返回的标头并检查 Location 标头。

    编辑:

    一些代码很有用:

    ...
    success: function(data, textStatus, jqXHR)
        {
        // You must look for Location
        console.log(jqXHR.getAllResponseHeaders());
        },
    ...
    

    (1)https://github.com/toastdriven/django-tastypie/blob/master/tastypie/resources.py#L1244

    【讨论】:

    • 事实上,我不会用这个资源来保存数据。只是对一些基于 ajax 的业务逻辑有用
    • 嗯,这很奇怪。然后你应该返回一个包含内容的响应。默认情况下,Tastypie 以空响应内容进行响应。您为什么不使用更多信息更新您的问题?
    • 我希望你明白你没有以正确的方式使用 REST。
    【解决方案2】:

    您只需将 always_return_data = True 添加到您的 Meta。然后你会得到一个带有序列化数据的202,而不是普通的201

    来自https://stackoverflow.com/a/10138745/931277

    这里是文档:http://django-tastypie.readthedocs.org/en/latest/resources.html#always-return-data

    【讨论】:

      【解决方案3】:

      其实我不会通过这个Resource保存数据,它是一个基于ajax的业务逻辑资源,应该应用一些控件,

      我更喜欢提出ImmediateHttpResponse,这样我就可以像这样指定 HttpResponse 类型:

      def obj_create(self, bundle, request=None, **kwargs):
          bundle.data['results'] = bundle.obj.check(request)
          if bundle.data['results']['valid']:
               raise ImmediateHttpResponse(self.create_response(request, bundle,response_class = HttpCreated))
          raise ImmediateHttpResponse(self.create_response(request,  bundle.data['results']['message'],response_class = HttpBadRequest))
      

      【讨论】:

        猜你喜欢
        • 2012-04-21
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多