5

你如何从它的uri中获取一个美味的模型资源的模型对象?

例如:

如果在 python 中将 uri 作为字符串给出,如何获取该字符串的模型对象?

4

3 回答 3

2

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]
于 2013-06-07T12:28:59.633 回答
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']
于 2013-09-16T15:59:38.673 回答
1

你在找流程图吗?这实际上取决于您何时需要该对象。

在脱水循环中,您可以简单地通过捆绑访问它,例如

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 或主键(或任何它)?

于 2013-05-02T08:05:10.873 回答