【问题标题】:How is ModelResource obj_get implemented?ModelResource obj_get 是如何实现的?
【发布时间】:2012-04-16 07:30:27
【问题描述】:

我必须实现一个覆盖原始 obj_get 方法的新 ModelResource。我必须返回什么样的对象?一个 Django 模型的实例? Tastypie 文档中没有很好地解释它。假设我有一个 Django 模型,我想将其返回为 json 并发回给发出 GET 请求的人。一般是怎么实现的?

我有这个代码:

  def obj_get(self, request=None, **kwargs):
    return Item.objects.get(id=kwargs['pk'])

这只是为了向您展示我正在尝试做的事情。我发现这不是我必须返回的 Django 实例。我必须返回什么?

【问题讨论】:

    标签: django tastypie


    【解决方案1】:

    实际上,这正是您应该返回的。我建议你看看 Tastypie 对obj_get 的实现:

     def obj_get(self, request=None, **kwargs):
        """
        A ORM-specific implementation of ``obj_get``.
    
        Takes optional ``kwargs``, which are used to narrow the query to find
        the instance.
        """
        try:
            base_object_list = self.get_object_list(request).filter(**kwargs)
            object_list = self.apply_authorization_limits(request, base_object_list)
            stringified_kwargs = ', '.join(["%s=%s" % (k, v) for k, v in kwargs.items()])
    
            if len(object_list) <= 0:
                raise self._meta.object_class.DoesNotExist("Couldn't find an instance of '%s' which matched '%s'." % (self._meta.object_class.__name__, stringified_kwargs))
            elif len(object_list) > 1:
                raise MultipleObjectsReturned("More than '%s' matched '%s'." % (self._meta.object_class.__name__, stringified_kwargs))
    
            return object_list[0]
        except ValueError:
            raise NotFound("Invalid resource lookup data provided (mismatched type).")
    

    如您所见,他们使用self.get_object_list 来获取满足条件的项目列表(在这种情况下,kwargs 应该包含pk)并且希望只获得一个项目。在这种情况下,他们返回第一个(也是该列表中唯一的项目)。否则会引发异常。不过,对于 Django,列表只是一个查询集。

    通常 - obj_get 应该返回一个对象,该对象具有与资源属性相对应的属性。 Using Riak for MessageResource 中给出了一个很好的例子,其中字典被包装在 RiakObject 类中,这样您就可以使用 Tastypie 所需的 obj.attribute 而不是 obj.attribute(因此 Django 模型实例将起作用)。

    总而言之,您可以返回一个 Django 模型实例,或者如果您需要一些额外的工作并希望降低性能,您可以使用模型实例属性构建字典并将它们包装在类中,例如 @ 987654331@ 上面提到。我不推荐后者,但如果是 Django :)

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 2015-05-22
      • 2015-04-22
      • 2020-07-31
      • 2011-04-24
      • 2016-04-17
      • 2013-08-23
      • 2014-05-27
      相关资源
      最近更新 更多