我正在使用一些简单的 django-tastypie 资源,但存在以下问题:
假设我正在构建一个简单的评级系统。我有一个资源,称之为 Rating
,它同时具有 User
和 Comment
。每个用户的每条评论最多有一个评分。
我想制作一个采用元组 ('user', 'comment')
的通用资源。然后,每当我使用新的 Rating
进行 POST 时,我希望它检查 user
和 comment
字段以查看评级匹配这两个字段已经存在。如果是,覆盖现有资源,否则创建一个新资源(这样任何 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/