我正在处理一些简单的django-tastypie资源,其中包含以下问题:
想象一下,我正在构建一个简单的评级系统。我有一个资源,称之为Rating
,同时包含User
和Comment
。每个用户每条评论最多只有一个评级。
我想创建一个采用元组('user', 'comment')
的通用资源。然后,每当我使用新的Rating
进行POST时,我都希望检查user
和comment
字段,看看是否已经存在与这两个字段匹配的评级。如果是,则覆盖现有资源,否则创建新资源(以便任何API调用始终通过Django的unique_together)。
我正在使用obj_get
作为起点,但很难理解如何正确地覆盖它以获得此行为。
答案 0 :(得分:6)
在#tastypie
:
建议不要更改标准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()