Вычисляемое поле (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
и т.д.)