Извините за задержку, накидал текст для рецепта. Строго не судите, лучше подскажите :)
Вычисляемые поля в моделях
Вычисляемое поле (calculated field)- поле значение которого вычисляется на основе значений других полей или действий с другими полями.
Чтобы понять пример, который приведен ниже надо иметь понятие про менеджеры моделей и метод позволяющий изменять SQL-код сгенерированного QuerySet-а (метод extra())
Вот пример кода:
class CalcManager(models.Manager): # Наш менеджер, который нам дает возможность менять поведение модели
def get_query_set(self):
result=super(CalcManager, self).get_query_set().extra(select={'total': "first+second"})
#то место где надо задавать алгоритм по которому вычисляется поле total
return result
class Calc(models.Model):
first = models.IntegerField(null=True)
second = models.IntegerField(null=True)
total = CalcManager() # Созданный нами менеджер
objects = models.Manager() # Стандартный менеджер
Вроде как должно быть понятно. Два менеджера нужны для того, что б при запросах когда нам поле total не нужно мы вызываем стандарный менеджер (Calc.objects) и тем самым не заставляем сервер тратить ресурс на вычисление поля. А для получения поля total вызываем созданный нами менеджер CalcManager (Calc.total), который является наследником базового менеджера модели (мы переопределили только метод get_query_set) и потому на выходе мы получаем обычный QuerySet с необходимыми нам свойствами (filter, order_by и т.д.)