1

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

我有这个代码:

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

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

4

1 回答 1

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应该返回一个具有与资源属性相对应的属性的对象。Using Riak for MessageResource中给出了一个很好的例子,其中一个字典被包装在RiakObject类中,这样obj[ 'attribute' ]你就可以做obj.attributeTastypie 所需的操作(因此 Django 模型实例将起作用)。

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

祝你好运!

于 2012-04-17T10:48:43.787 回答