我发送一个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');
}
});
答案 0 :(得分:9)
您只需将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
答案 1 :(得分:2)
实际上,我不打算通过这个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))
答案 2 :(得分:0)
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