如何在资源显示为列表时覆盖显示的资源URI?

时间:2013-05-29 15:49:47

标签: python django tastypie

我想在UserResource URI中包含用户名,但仅限于将资源列为Full=False时。

我试图覆盖dehydrate_resource_uri,但这仅适用于查看资源的详细信息视图时,我已尝试覆盖get_resource_uri,但我不知道如何检测是否资源切换为Full与否,UserResource始终被视为api_dispatch_detail,即使它显示为另一个资源的字段。

以下是GroupResource的示例,其中UserResource是嵌套的,我想要显示的内容

{
    id: 1,
    resource_uri: "/api/v2/group/1/",
    users: [
        [
            "/api/v2/user/8/",
            "First_name Last_name" #this is what I'd like to have added
        ],
        [
            "/api/v2/user/9/",
            "First_name Last_name" #this is what I'd like to have added
    ]
}

然后UserResource详细信息页面不应显示名称:

{
    id: 1,
    first_name: "",
    last_name: "",
    resource_uri: "api/v2/user/1/", #no names needed here, since I've already got their name 
}

棘手的部分是在UserResource的详细视图中,我不需要在resource_uri中显示他们的名字和姓氏,虽然我知道我可以使用dehydrate_resource_uri删除名称从uri显示到api用户之前。我还可以检查请求路径以查看正在查看的资源,但这不是想法,因为它需要硬编码的uri。

所以问题是如何根据资源是仅显示为URI还是显示完全详细的视图来显示自定义URI。

1 个答案:

答案 0 :(得分:0)

不会很快接受我自己的回答,但我目前的解决方案似乎有效:

  • get_resource_uri中,使用名称作为元组构建完整的uri
  • dehydrate_resource_uri中,只返回uri元组中的第一个元素

    def dehydrate_resource_uri(self, bundle):
    """
    For the automatically included ``resource_uri`` field, dehydrate
    the URI for the given bundle.
    
    Returns empty string if no URI can be generated.
    """
    
    try:
        uri=  self.get_resource_uri(bundle)
        return uri[0]
    
    except NotImplementedError:
        return ''
    except NoReverseMatch:
        return ''
    

    def dehydrate_resource_uri(self, bundle):


        try:
            uri=  self.get_resource_uri(bundle)
            return uri[0] #return only uri

        except NotImplementedError:
            return ''
        except NoReverseMatch:
            return ''

我认为这样做是为了无论何时调用UserResource的详细视图,dehydrate_resource_uri也会被调用并运行,但不需要只需要uri本身。