6

我正在使用一些简单的 django-tastypie 资源,但存在以下问题:

想象一下,我正在构建一个简单的评级系统。我有一个资源,称它为同时Rating具有 aUser和 a Comment。每个用户对每个评论最多有一个评分。

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

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

4

1 回答 1

6

在讨论 IRC 之后#tastypie

建议不要更改标准 API 行为,因为这可能很危险,因为客户端不会看到整个 API 的一致行为。

一种解决方案是让 Tastypie 在尝试创建 时返回 4xx 响应Rating,在这种情况下,客户端将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()
于 2012-05-06T22:44:14.963 回答