【问题标题】:Get model object from tastypie uri?从 sweetpie uri 获取模型对象?
【发布时间】:2013-05-02 05:44:10
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: python django tastypie


    【解决方案1】:

    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]
    

    【讨论】:

      【解决方案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']
      

      【讨论】:

        【解决方案3】:

        您在寻找flowchart 吗?这真的取决于什么时候你想要这个对象。

        在脱水循环中,您可以通过 bundle 访问它,例如

        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 或主键(或其他任何内容)?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-19
          • 2012-09-15
          • 2012-03-18
          • 1970-01-01
          • 1970-01-01
          • 2012-10-14
          相关资源
          最近更新 更多