ModelResource如何实现obj_get?

时间:2012-04-16 07:30:27

标签: django tastypie

我必须实现一个新的ModelResource来覆盖原始的obj_get方法。我必须返回什么样的物体? Django模型的一个实例?在Tastypie文档中没有很好地解释它。让我们说我有一个Django模型,我想返回json并发回给任何做GET请求的人。它是如何正常实施的?

我有这段代码:

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

它只是告诉你我想做什么。我已经发现它不是我必须返回的Django实例。我该怎么回事?

1 个答案:

答案 0 :(得分:3)

实际上,这正是你应该回归的。我建议你看一下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应该返回一个对象,该对象具有与Resource属性对应的属性。在Using Riak for MessageResource中给出了一个很好的示例,其中字典包含在RiakObject类中,因此您可以执行obj[ 'attribute' ]来代替obj.attribute Tastypie所需的RiakObject(以及Django模型实例将起作用。)

总而言之,你可以返回一个Django模型实例,或者如果你想要一些额外的工作并希望恶化性能,你可以用模型实例属性构建字典并将它们包装在类{{ {1}}如上所述。我不推荐后者,但在Django的情况下:)

祝你好运!