Задать вопрос
@Postalus

Можно ли реализовать вычисление значения поля непосредственно в модели?

Граждане эксперты, возник такой вопрос. У меня назрела необходимость создать модель, в которой значения некоторых полей будут вычисляться исходя из значений других полей. Вот как я это реализовал (пример упрощённый, но суть передаёт):
class Zzz(Superclass):
    aaa = models.ForeignKey(Aaa)
    bbb = models.ForeignKey(Bbb)
    ccc = models.ForeignKey(Ccc)

    @property
    def eee(self):
        return self.aaa, self.bbb, self.ccc

    @property
    def ddd(self):
        return reduce((lambda x, y: x + y), [e.some_param for e in self.eee])


Правильно ли я понимаю, что значение ddd будет вычисляться заново при каждом новом обращении? Можно ли переделать код модели так, чтобы значение поля вычислялось однократно при создании записи, а в последствии просто считывалось из БД? Или единственный вариант - представления?
  • Вопрос задан
  • 192 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@marazmiki
Укротитель питонов
Переделать-то можно, но тогда это это поле придётся добавлять в схему. А заполнять при сохранении:
class Zzz(Superclass):
    aaa = models.ForeignKey(Aaa)
    bbb = models.ForeignKey(Bbb)
    ccc = models.ForeignKey(Ccc)
    # Объявили поле и на всякий случай запретили редактировать его из админки или через форму.
    ddd = models.IntegerField(editable=False, default=0) 

    @property
    def eee(self):
        return self.aaa, self.bbb, self.ccc

    def save(self, *args, **kwargs):
        # Непосредственно перед физическим сохранением вычисляем значение поля
        self.ddd = reduce((lambda x, y: x + y), [e.some_param for e in self.eee])
        return super(Zzz, self).save(*args, **kwargs)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы