我想知道是否有一种干净的方法可以使用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'])
答案 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'])