следующий бит кода регулярно выполняется как cronjob и оказывается очень дорогим в вычислительном отношении! Основная проблема заключается в цикле for, и я думаю, что это можно сделать несколько более эффективным с помощью лучшей фильтрации, однако я не знаю, как это сделать.
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 все еще должен циклически проходить через группу пользователей, чтобы наконец найти те немногие, с которыми ему нужно выполнить операцию. В идеале я бы отфильтровал всех пользователей, которые не соответствуют критериям, и только потом начал бы просматривать список пользователей - есть ли какая-то волшебная пуля, которую я могу использовать для достижения этой цели?