Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果资源已经存在,如何使Django Tastypie覆盖该资源?_Python_Django_Tastypie - Fatal编程技术网

Python 如果资源已经存在,如何使Django Tastypie覆盖该资源?

Python 如果资源已经存在,如何使Django Tastypie覆盖该资源?,python,django,tastypie,Python,Django,Tastypie,我正在使用一些简单的django tastypie资源,但存在以下问题: 想象一下,我正在建立一个简单的评级系统。我有一个资源,称之为Rating,它既有用户又有注释。每个用户对每条评论最多有一个评级 我想创建一个通用资源,它采用元组('user','comment')。然后,每当我发布一篇新的评级,我都希望它检查用户和评论字段,看看是否已经存在与这两个字段匹配的评级。如果是,则覆盖现有资源,否则创建一个新资源(以便任何API调用都将传递Django的) 我正在使用obj\u get作为起点,但

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

想象一下,我正在建立一个简单的评级系统。我有一个资源,称之为
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()