我必须实现一个新的ModelResource来覆盖原始的obj_get方法。我必须返回什么样的物体? Django模型的一个实例?在Tastypie文档中没有很好地解释它。让我们说我有一个Django模型,我想返回json并发回给任何做GET请求的人。它是如何正常实施的?
我有这段代码:
def obj_get(self, request=None, **kwargs):
return Item.objects.get(id=kwargs['pk'])
它只是告诉你我想做什么。我已经发现它不是我必须返回的Django实例。我该怎么回事?
答案 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的情况下:)
祝你好运!