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

时间:2012-10-16 16:27:05

标签: ajax django tastypie

我发送一个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');
                 }
               });

3 个答案:

答案 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