以下代碼作爲cronjob定期運行,結果非常計算量大!主要的問題是在for循環中,我認爲這可以通過更好的過濾來提高效率,但是我不知道該怎麼做。如何更好地在appengine中使用過濾器,以便通過循環一長串實體來節省我的過濾?
free_membership_type = MembershipType.all().filter("membership_class =", "Free").filter("live =", True).get()
all_free_users = UserMembershipType.all().filter("membership_active =", True)
all_free_users = all_free_users.filter("membership_type =", free_membership_type).fetch(limit = 999999)
if all_free_users:
for free_user in all_free_users:
activation_status = ActivationStatus.all().filter("user = ", free_user.user).get()
if activation_status and activation_status.activated:
documents_left = WeeklyLimits.all().filter("user = ", free_user.user).get()
if documents_left > 0:
do something...
該代碼使用的是型號:
class MembershipType(db.Model):
membership_class = db.StringProperty()
membership_code = db.StringProperty()
live = db.BooleanProperty(default = False)
class UserMembershipType(db.Model):
user = db.ReferenceProperty(UserModel)
membership_type = db.ReferenceProperty(MembershipType)
membership_active = db.BooleanProperty(default = False)
class ActivationStatus(db.Model):
user = db.ReferenceProperty(UserModel)
activated = db.BooleanProperty(default = False)
class WeeklyLimits(db.Model):
user = db.ReferenceProperty(UserModel)
membership_type = db.ReferenceProperty(MembershipType)
documents_left = db.IntegerProperty(default = 0)
但是for循環,我在生產中使用並更好地利用緩存的各種實體的代碼,仍然可以通過具有周期一堆用戶終於找到它需要做的操作。理想情況下,我會過濾掉所有不符合條件的用戶,然後開始循環瀏覽用戶列表 - 我可以在此處使用某種魔術彈藥來實現此目的嗎?
在一個不相關的說明中;儘管你的「limit = 99999」fetch()一次只會返回1000個實體,但是如果你在不調用fetch()的情況下使用「for all_free_users:」中的用戶,你可以遍歷所有的實體。 http://stackoverflow.com/questions/264154/google-appengine-how-to-fetch-more-than-1000 – arkanciscan 2012-02-16 19:17:30
感謝一個很酷的提示arkanciscan,謝謝 - 我會給它一個bash。 – user714852 2012-02-17 23:39:32