0

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

我的想法是覆盖 .all() 方法,使用过滤器调用父级 .all() 。这是我第一次使用 Google App Engine,所以我做了很多猜测工作。

我想我可以从这样的事情开始:

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)

我明白了:

类型错误:必须以 Bob 实例作为第一个参数调用未绑定的方法 all()(什么都没有)

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

解决方案(稍后添加)

class Bob(db.Model):
    stuff = db.StringProperty()
    active = db.BooleanProperty(default=False)
    @classmethod
    def all(cls, keys_only=False):
        if keys_only == True:
            qry = super(Bob,cls).all(keys_only=True)
            qry.filter('active =', True)
            return qry
        else:
            qry = super(Bob,cls).all(keys_only=False)
            qry.filter('active =', True)
            return qry
4

2 回答 2

1

首先,您有一个基本的 python 类/方法问题。正如错误所说TypeError: unbound method all() must be called with Bob instance as first argument (got nothing instead)

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

它应该是

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

另请注意,在您的代码中您没有返回任何内容。all() 返回一个查询对象,您也可以应用更多过滤器。

我不会覆盖所有并应用过滤器,因为您将有效地阻止您使用裸 all()

创建另一个类方法,即。filters_all() 并使用它,以便您可以保留 all() 。

例如

@classmethod
def filtered_all(cls,keys_only=False) 
    qry = cls.all(keys_only)
    qry.filter('some boolean operation')
    return qry

单独说明,如果你对db没有投资,我个人认为你应该切换到ndb。

于 2013-10-12T00:53:28.510 回答
0

Tim 的回答是对的,但是因为您只有一个类,或者可能只有少数类,您可以轻松地在 Bob.all() 上进行搜索和替换,并将其更改为 Bob.filter(yournewboolean=True)。

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

于 2013-10-12T02:01:55.737 回答