Движок приложений Google имеет интеллектуальную функцию с именем обратных ссылок, и я обычно повторяю их там, где необходимо использовать вычисляемый столбец SQL.
Только представьте, что нужно накапливать определенную силу в л.с.
class Force(db.Model):
hp = db.IntegerProperty()
class UnitGroup(db.Model):
force = db.ReferenceProperty(reference_class=Force,collection_name="groups")
hp = db.IntegerProperty()
class Unit(db.Model):
group = db.ReferenceProperty(reference_class=UnitGroup,collection_name="units")
hp = db.IntegerProperty()
Когда я кодировал, как следует, это было ужасно медленно (почти 3 с) с 20 силами с одной группой - одной единицей. (Я полагаю, обратная ссылка на принудительную перезагрузку суб-сущностей. Я права?)
def get_hp(self):
hp = 0
for group in self.groups:
group_hp = 0
for unit in group.units:
group_hp += unit.hp
hp += group_hp
return hp
Как я могу оптимизировать этот код? Пожалуйста, учтите, что для каждой группы сил / юнитов должно быть рассчитано больше свойств, и я не хочу сохранять эти коллективные свойства для каждой сущности. :)