Python 如果资源已经存在,如何使Django Tastypie覆盖该资源?
我正在使用一些简单的django tastypie资源,但存在以下问题: 想象一下,我正在建立一个简单的评级系统。我有一个资源,称之为Python 如果资源已经存在,如何使Django Tastypie覆盖该资源?,python,django,tastypie,Python,Django,Tastypie,我正在使用一些简单的django tastypie资源,但存在以下问题: 想象一下,我正在建立一个简单的评级系统。我有一个资源,称之为Rating,它既有用户又有注释。每个用户对每条评论最多有一个评级 我想创建一个通用资源,它采用元组('user','comment')。然后,每当我发布一篇新的评级,我都希望它检查用户和评论字段,看看是否已经存在与这两个字段匹配的评级。如果是,则覆盖现有资源,否则创建一个新资源(以便任何API调用都将传递Django的) 我正在使用obj\u get作为起点,但
Rating
,它既有用户
又有注释
。每个用户对每条评论最多有一个评级
我想创建一个通用资源,它采用元组('user','comment')
。然后,每当我发布一篇新的评级
,我都希望它检查用户
和评论
字段,看看是否已经存在与这两个字段匹配的评级。如果是,则覆盖现有资源,否则创建一个新资源(以便任何API调用都将传递Django的)
我正在使用
obj\u get
作为起点,但很难理解如何正确覆盖它以获得此行为。在\tastype
中讨论IRC之后:
建议不要改变标准API行为,因为这可能是危险的,因为客户端不会看到API中的一致行为
一种解决方案是让Tastypie在尝试创建评级时返回4xx响应,在这种情况下,客户端将修补现有评级
但是,如果确实需要提高性能,那么只有在客户正式要求时,才应该改变行为。在您的情况下,这意味着向POST
请求添加replace\u existing\u rating=True
参数
因此,在您的情况下,如果您确实决定需要性能提升,您可以:
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()