2013-03-01 62 views
7

我想使用这里的例子:http://django-tastypie.readthedocs.org/en/latest/cookbook.html#nested-resourcesTastypie嵌套资源 - cached_obj_get()到底需要2个参数(1给出)

由于某种原因,我得到:

cached_obj_get()恰恰2个参数(给定1)

即使我清楚地以2个参数(酷似在上述例子中调用它 这是我的代码:

def prepend_urls(self): 
    return [ 
     url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/feed%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_feed'), name="api_get_feed"), 
] 

def get_feed(self, request, **kwargs): 
    try: 
     obj = self.cached_obj_get(request=request, **self.remove_api_resource_names(kwargs)) 
    except ObjectDoesNotExist: 
     return HttpGone() 
    except MultipleObjectsReturned: 
     return HttpMultipleChoices("More than one resource is found at this URI.") 

    feed_resource = FeedItemResource() 
    return feed_resource.get_list(request, p_id=obj.id) 

回答

14

很抱歉的混乱 - 有一个API change to improve authorization这改变了签名cached_obj_get来源:

def cached_obj_get(self, request=None, **kwargs): 

def cached_obj_get(self, bundle, **kwargs): 

这种变化是一致的前进 - 如果你需要的request对象,它可以作为bundle.request - 但显然文档需要更新。

就可以构建一个包对象:

basic_bundle = self.build_bundle(request=request) 

然后用它作为参数传递给cached_obj_get(见Resource.get_detail source code为例):

obj = self.cached_obj_get(bundle=basic_bundle, **self.remove_api_resource_names(kwargs)) 

其他混乱方面,如果你是不熟悉Python的对象模型的是,方法总是接收至少一个参数,因为第一个位置参数总是为object instance or self,关键字参数不包含在该计数中,所以“1给定”意味着我当它期待selfbundle时,thod只收到了self的位置参数。

+0

感谢David R.解释如何构建包并添加示例! – 2013-03-01 14:37:08

+0

我在为obj_get()搜索相同的错误消息时偶然发现了这个答案。这个答案同样适用于obj_get() – 2015-08-17 09:16:42

相关问题