你如何从它的uri中获取一个美味的模型资源的模型对象?
例如:
如果在 python 中将 uri 作为字符串给出,如何获取该字符串的模型对象?
Tastypie 的 Resource 类(这是 ModelResource 的子类)提供了一个方法get_via_uri(uri, request)
。请注意,apply_authorization_limits(request, object_list)
如果您没有收到所需的结果,请确保以通过您授权的方式编辑您的请求。
一个不好的选择是使用正则表达式从您的 url 中提取 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]
您可以使用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']
你在找流程图吗?这实际上取决于您何时需要该对象。
在脱水循环中,您可以简单地通过捆绑访问它,例如
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 或主键(或任何它)?