Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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 是否可以重写Model或Polymodel的all()方法以包含筛选器?_Python_Google App Engine - Fatal编程技术网

Python 是否可以重写Model或Polymodel的all()方法以包含筛选器?

Python 是否可以重写Model或Polymodel的all()方法以包含筛选器?,python,google-app-engine,Python,Google App Engine,我正在处理一个由其他人编写(并放弃)的大型项目,需要一种方法来对特定模型的.all()进行每次调用,并检查我添加的布尔值。整个项目实际上有数千个调用,所以我一直在寻找一种避免重写它们的方法 我的想法是重写.all()方法,用过滤器调用父.all()。这是我第一次使用谷歌应用程序引擎,所以我一直在做很多猜测工作 我想我可以这样开始: class Bob(polymodel.PolyModel): stuff = db.StringProperty() active = db.Boo

我正在处理一个由其他人编写(并放弃)的大型项目,需要一种方法来对特定模型的.all()进行每次调用,并检查我添加的布尔值。整个项目实际上有数千个调用,所以我一直在寻找一种避免重写它们的方法

我的想法是重写.all()方法,用过滤器调用父.all()。这是我第一次使用谷歌应用程序引擎,所以我一直在做很多猜测工作

我想我可以这样开始:

class Bob(polymodel.PolyModel):
    stuff = db.StringProperty()
    active = db.BooleanProperty(default=False)
    def all(self, keys_only=False):
        super(Bob,self).all()
joes = Bob.all()
    for joe in joes:
        self.response.write(joe.active)
但当我试着这样打电话时:

class Bob(polymodel.PolyModel):
    stuff = db.StringProperty()
    active = db.BooleanProperty(default=False)
    def all(self, keys_only=False):
        super(Bob,self).all()
joes = Bob.all()
    for joe in joes:
        self.response.write(joe.active)
我明白了:

TypeError:必须使用Bob实例作为第一个参数调用unbound方法all()(但没有得到任何结果)

这是我关于stackoverflow的第一篇文章,所以我希望我做得正确。任何帮助都将不胜感激

解决方案(稍后添加)


首先,您有一个基本的python类/方法问题。正如错误所说的
TypeError:unbound方法all()必须以Bob实例作为第一个参数调用(取而代之的是什么都没有)

您正在对一个类(不是实例)调用
all()
,但您已将被重写的
all()
定义为实例方法

应该是

@classmethod
def all(cls, keys_only=False):
    qry = super(Bob,cls).all(keys_only=keys_only)
    qry.filter(<some filter>)
    return qry

另一方面,如果您没有对db的投资,我个人认为您应该切换到ndb。

Tim的答案是正确的,但是因为您只有一个类,或者可能只有几个类,您可以轻松地搜索和替换Bob.all(),并将其更改为Bob.filter(yournewoolean=True)


任何像样的文本编辑器或IDE都可以在一分钟内为您完成这项工作。

如果您要覆盖
all
(而不是添加新的
filtered\u all
,就像在第二个示例中一样),您可能确实需要调用
super(Bob,cls)。all()
,因为
cls.all()
将是无限递归的(因此,当它达到系统递归限制时,它将引发一个
运行时错误
)。感谢各位,我要到周一才能测试代码,但它看起来不错。遗憾的是,我在技术方面没有发言权……我相信这个项目已经进行了多年,但他们失败了(被解雇了?)所有的原始开发人员和我的雇主都签订了完成该项目的合同。我可能会以一种不带过滤器的方式访问all,但在这个项目中,这个特定的模型将始终需要检查它是否处于活动状态,并且它已经在任何地方使用all()编写。再次感谢:)不用等到星期一才进行测试,我找到了一种方法:)我能够让它工作,但是只在代码的第3行上传递keys_会导致TypeError:all()只接受1个参数(给定2个参数)。。。但是,删除它或像前一行一样将其设置为False将使其工作。我要用我的功能代码更新我的帖子。谢谢,againI忘记了keys_only是一个命名参数,我编辑了下面的代码以反映这一点。谢谢,但是简单的查找和替换不起作用,因为某些部分已经附加了过滤器,并且有数千个实例。。。如果更换导致故障,则很难进行故障排除。我正在寻找的解决方案(看起来是另一个答案提供的)编写和故障排除要简单得多。不过,在大多数情况下,我会使用以下方法:)您在解决方案上的缩进是不正确的。另外,如果keys\u only=True:
条件为,为什么要将
置于其中。只需将key_传递到all()调用中。ie
all(keys\u only=keys\u only)
根据我的回答。需要测试和更新的代码更少。抱歉,刚才回到这里。。。它没有正确粘贴,我当时也没有注意到。我来修压痕。但是出于某种原因,你的解决方案不起作用,尽管我认为它也应该起作用。if块是我的工作,因为你的方法不起作用。