Tastypie -- 如何让 obj_create 将新创建的实体发回?

Posted

技术标签:

【中文标题】Tastypie -- 如何让 obj_create 将新创建的实体发回?【英文标题】:Tastypie -- How to make obj_create send the newly created entity back? 【发布时间】: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');
                 
               );

【问题讨论】:

【参考方案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 以空响应内容进行响应。您为什么不使用更多信息更新您的问题? ***.com/questions/12919248/… 我希望你明白你没有以正确的方式使用 REST。【参考方案2】:

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

来自https://***.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))

【讨论】:

以上是关于Tastypie -- 如何让 obj_create 将新创建的实体发回?的主要内容,如果未能解决你的问题,请参考以下文章

Django Tastypie,运行一个动作

如何通知应用程序凭据在 Django/Tastypie/REST 中成功

Django Tastypie:带有“空格”的反向 url。如何?

如何在 Django Tastypie 中包装自定义端点?

Tastypie 的距离空间查询

Tastypie 不发送 cookie