我正在編寫一個大的項目,這個項目是由其他人編寫(並放棄)的,並且需要一種方法來使每個對.all()的調用都爲特定模型檢查一個布爾值。整個項目實際上有數千個電話,所以我一直在尋找一種方法來避免重寫它們。是否可以重寫Model或Polymodel的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)
我得到這個:
類型錯誤:未綁定的方法all()必須以Bob實例作爲第一個參數被調用(取而代之)
這是我在stackoverflow上的第一篇文章,所以我希望我已經做到了這一點。任何幫助將不勝感激。
SOLUTION(後來加入)
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
您在解決方案上的縮進不正確。此外,爲什麼要將'if keys_only = True:'條件放入。只需將keys_only傳遞給all()調用。即'所有(keys_only = keys_only)'按照我的答案。更少的代碼來測試並保持最新狀態。 –
對不起,剛纔回來了...它沒有正確粘貼,我當時沒有注意到。我會修正縮進。出於某種原因,儘管我認爲它應該如此,但你的解決方案並不奏效。 if塊是我的解決方法,你的方法不工作。 – user2872818