Django REST框架,从URL获取对象

时间:2014-01-28 13:18:13

标签: django-rest-framework

我想知道是否有一种干净的方法可以使用django rest框架从其URL中检索对象。当然应该有,因为它似乎是使用HyperlinkedRelatedField时发生的事情。

例如,我将此网址/api/comment/26作为字符串。从我的角度来看,如何使用pk=26获取评论实例?

当然我可以重做工作并处理字符串,但它必须是更好的方法吗?

非常感谢。

编辑:

这就是我最后解决的问题:

resolve('/api/comment/26/').func.cls.model将返回我的模型评论。 resolve('/api/category/1/').kwargs['pk']将返回pk。

这给了你:

from django.core.urlresolvers import resolve

resolved_func, unused_args, resolved_kwargs = resolve('/api/category/1/')
resolved_func.cls.model.objects.get(pk=resolved_kwargs['pk'])

3 个答案:

答案 0 :(得分:3)

我怀疑你最好的选择是手动将模型地图保存到网址模式 - 与URLConf不太相似。

如果那不能晃动你的船,你可以pass the path into resolve

这会为您提供一个ResolverMatch,您可以在设置网址时找到func来电时返回的as_view

您的视图函数的__name__属性将是原始视图类的属性。做globals()[class_name]这样的事情来获得课程本身。

从那里访问model属性。

我希望有所帮助。正如我所说,您可能只想自己将模型映射到URL。

答案 1 :(得分:2)

使用基于类的视图时,似乎需要以下内容:

resolve(url).func.cls.serializer_class.Meta.model.objects.get(
    **resolve(url).kwargs)

答案 2 :(得分:0)

上面的解决方案对我不起作用,但以下确实有效:

from django.core.urlresolvers import resolve

resolved_func, unused_args, resolved_kwargs = resolve('/api/category/1/')
resolved_func.cls().get_queryset().get(id=resolved_kwargs['pk'])

此外,此解决方案使用视图的内置查询集,该查询集可能包含注释或重要过滤器。

使用HyperlinkedModelSerializer我实际上需要使用完整的URL进行此操作。为此,您需要首先提取路径,结果是:

import urllib.parse
from django.core.urlresolvers import resolve

def obj_from_url(url):
    path = urllib.parse.urlparse(url).path
    resolved_func, unused_args, resolved_kwargs = resolve(path)
    return resolved_func.cls().get_queryset().get(id=resolved_kwargs['pk'])