Python 将“QuerySet”从Django 1.4更改为1.7

Python 将“QuerySet”从Django 1.4更改为1.7,python,django,django-queryset,django-1.7,django-1.4,Python,Django,Django Queryset,Django 1.7,Django 1.4,我正在尝试从Django 1.4.15->1.7.3移植一个应用程序 我遇到了一个问题,应用程序在models.py中有一个方法 def is_votable(self, user): ''' Decides if the user can vote for him/herself or not ''' if self.rated_by.all().__contains__(user): return Fal

我正在尝试从Django 1.4.15->1.7.3移植一个应用程序

我遇到了一个问题,应用程序在models.py中有一个方法

def is_votable(self, user):
        '''
        Decides if the user can vote for him/herself or not
        '''
        if self.rated_by.all().__contains__(user):
            return False
        return True
我遇到的问题位于这一行:

if self.rated_by.all().__contains__(user):
这会产生错误:

'QuerySet' object has no attribute '__contains__'
我可能是瞎了眼,因为我看不到在Django中哪里会被弃用。
非常感谢您的帮助。还可以询问您是否需要更多信息。

您几乎不应该在代码中调用双下划线方法,如uu contains。在几乎所有情况下,您都使用In运算符:

if user in self.rated_by.all():
请注意,这是Python范围内的事情:例如,不调用mylist,而是使用lenmylist,而不是myobj,unicode,等等

但是,在这种特殊情况下,您可能会发现执行查询更有效:

if self.rated_by.filter(user_id=user.id).exists():

这将针对单个EXISTS查询命中数据库。如果您没有在该特定对象的任何其他位置使用queryset的额定值,这肯定比查询所有对象和检查成员资格更有效。

您几乎不应该在代码中调用双下划线方法,如uu contains。在几乎所有情况下,您都使用In运算符:

if user in self.rated_by.all():
请注意,这是Python范围内的事情:例如,不调用mylist,而是使用lenmylist,而不是myobj,unicode,等等

但是,在这种特殊情况下,您可能会发现执行查询更有效:

if self.rated_by.filter(user_id=user.id).exists():
这将针对单个EXISTS查询命中数据库。如果您没有在该特定对象的任何其他位置使用queryset的rated_,那么这肯定比查询所有对象和检查成员资格更有效。

当queryset迭代不再在块中创建模型时,使用了uu contains_uuu方法

当in调用_contains__方法(如果存在)时,in操作符不需要存在就可以工作。事实上,如果您只提供一个返回iterable的_iter___)方法,它就可以工作。由于重构不再需要任何特殊的逻辑,而且_contains _是一个私有函数,因此在发行说明中没有任何特定说明就删除了它。这是一个很好的理由,可以按照Daniel的建议去做,并且始终使用公共API,即in操作符。

当queryset迭代不再以块的形式创建模型时,\uu包含\uuuuuuuu方法


当in调用_contains__方法(如果存在)时,in操作符不需要存在就可以工作。事实上,如果您只提供一个返回iterable的_iter___)方法,它就可以工作。由于重构不再需要任何特殊的逻辑,而且_contains _是一个私有函数,因此在发行说明中没有任何特定说明就删除了它。这是一个很好的理由去做Daniel建议的事情,并且始终使用公共API,即in操作符。

谢谢这帮了大忙。这也解释了很多。非常感谢你的回答。别忘了接受答案,向未来的搜索者表明它解决了问题。谢谢你的帮助。这也解释了很多。非常感谢您的回答。不要忘记接受答案,向未来的搜索者表明它解决了问题。