如何从它的uri获取tastypie模型资源的模型对象?
例如:
如果你在python中给uri作为字符串,你如何获得该字符串的模型对象?
答案 0 :(得分:2)
Tastypie的Resource类(ModelResource是子类化的人)提供了一种方法get_via_uri(uri, request)
。请注意他拨打apply_authorization_limits(request, object_list)
的电话,因此如果您没有收到所需的结果,请确保以通过授权的方式编辑您的请求。
一个不好的选择是使用正则表达式从您的网址中提取ID,然后使用它来筛选所有对象的列表。这是我的脏黑客,直到我让get_via_uri工作,我不建议使用它。 ;)
id_regex = re.compile("/(\d+)/$")
object_id = id_regex.findall(your_url)[0]
your_object = filter(lambda x: x.id == int(object_id),YourResource().get_object_list(request))[0]
答案 1 :(得分:2)
您可以使用get_via_uri
,但正如@Zakum所提到的,这将会应用您可能不需要的授权。因此,深入了解该方法的来源,我们发现我们可以像这样解析URI:
from django.core.urlresolvers import resolve, get_script_prefix
def get_pk_from_uri(uri):
prefix = get_script_prefix()
chomped_uri = uri
if prefix and chomped_uri.startswith(prefix):
chomped_uri = chomped_uri[len(prefix)-1:]
try:
view, args, kwargs = resolve(chomped_uri)
except Resolver404:
raise NotFound("The URL provided '%s' was not a link to a valid resource." % uri)
return kwargs['pk']
如果您的Django应用程序位于网络服务器的根目录(即get_script_prefix() == '/'
),那么您可以将其简化为:
view, args, kwargs = resolve(uri)
pk = kwargs['pk']
答案 2 :(得分:1)
您在寻找flowchart吗?它真的取决于何时你想要的对象。
在脱水循环中,你可以通过捆绑包来访问它,例如
class MyResource(Resource):
# fields etc.
def dehydrate(self, bundle):
# Include the request IP in the bundle if the object has an attribute value
if bundle.obj.user:
bundle.data['request_ip'] = bundle.request.META.get('REMOTE_ADDR')
return bundle
如果你想通过api url手动检索一个对象,给定一个模式,你可以通过默认的orm方案简单地遍历slug或主键(或其他任何东西)?