从tastypie uri获取模型对象?

时间:2013-05-02 05:44:11

标签: python django tastypie

如何从它的uri获取tastypie模型资源的模型对象?

例如:

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

3 个答案:

答案 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或主键(或其他任何东西)?