如果资源已经存在,我如何才能使Django-Tastypie覆盖资源?

时间:2012-05-06 21:52:09

标签: python django tastypie

我正在处理一些简单的django-tastypie资源,其中包含以下问题:

想象一下,我正在构建一个简单的评级系统。我有一个资源,称之为Rating,同时包含UserComment。每个用户每条评论最多只有一个评级。

我想创建一个采用元组('user', 'comment')的通用资源。然后,每当我使用新的Rating进行POST时,我都希望检查usercomment字段,看看是否已经存在与这两个字段匹配的评级。如果是,则覆盖现有资源,否则创建新资源(以便任何API调用始终通过Django的unique_together)。

我正在使用obj_get作为起点,但很难理解如何正确地覆盖它以获得此行为。

1 个答案:

答案 0 :(得分:6)

#tastypie

中讨论IRC之后

建议不要更改标准API行为,因为从客户端看不到API中的一致行为的意义上说这可能很危险。

一种解决方案是让Tastypie在尝试创建Rating时返回4xx响应,在这种情况下,客户端将PATCH现有评级。

但是,如果性能提升确实必要,那么只有在客户端正式要求时才应改变行为。在您的情况下,这意味着在replace_existing_rating=True请求中添加POST参数。

所以在你的情况下,如果确实决定你需要提升性能,你可以:

class CommentResource(ModelResource):
    def obj_create(self, bundle, request=None, **kwargs):
        if bundle.data.get("replace_existing_rating", False):
            try:
                bundle.obj = self._meta.object_class._default_manager.get(**conditions)
            except self._meta.object_class.DoesNotExist:
                bundle.obj = self._meta.object_class()