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 Created
HTTP 响应,并设置了 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/REST 中成功