7

我正在尝试使用此处的示例:http: //django-tastypie.readthedocs.org/en/latest/cookbook.html#nested-resources

出于某种原因,我得到:

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)
4

1 回答 1

14

很抱歉造成混淆 - 有一个API 更改以改进授权,它更改了来自的签名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源代码为例):

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

如果您不熟悉 Python 的对象模型,另一个令人困惑的方面是方法总是接收至少一个参数,因为第一个位置参数始终是对象实例,或者self关键字参数不包含在该计数中,因此“1 给定”意味着该方法仅在期望and时才收到self位置参数。selfbundle

于 2013-03-01T14:05:03.750 回答