python - 如果资源已经存在,我如何让 Django-Tastypie 覆盖它?

标签 python django tastypie

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

假设我正在构建一个简单的评级系统。我有一个资源,称之为 Rating,它同时具有 UserComment。每个用户的每条评论最多有一个评分。

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

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

最佳答案

根据 #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()

关于python - 如果资源已经存在,我如何让 Django-Tastypie 覆盖它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10474615/

相关文章:

Python子类计数器

django - 在 Django 设置之后立即运行启动代码? (也适用于命令)

使用 Django csrf_exempt View 注册 Android GCM。最佳实践?

python - Tastypie 如何将模型中的错误正确地反馈给用户?

django - 如何登录? Django TastyPie with ApiKeyAuthentication 实际认证过程

python - 如何使用 pip 更新/升级包?

python - 派克达/CUDA : Causes of non-deterministic launch failures?

python - 提取压缩文件

python - Django 表单图像字段出现在 self.data 中但没有出现在 self.cleaned_data 中

http - 在主干中放置一个自定义的 http header