Django Вычисляемые поля Сохранить()

Это очень просто, но у меня проблемы с поиском правильного способа сделать это. Я хотел бы иметь поля, которые вычисляются и сохраняются в базе данных. В примере, cHpd, cMpd и cBph - все поля, которые вычисляются в функции calc_rates. Я пытаюсь понять, как это сделать.

'''
class Route(models.Model):
rtNumber = models.CharField(max_length = 5)
rtState = models.CharField(max_length = 2)
rtOffice = models.CharField(max_length = 255)
#stDate = models.DateField(blank=True)
#edDate = models.DateField(blank=True)
llcName = models.CharField(max_length =255)
boxes = models.IntegerField(null=True)
miles = models.IntegerField(null=True)
hours = models.IntegerField(null=True)
wrkDays = models.IntegerField(null=True)
activeCont= models.BooleanField(default=None)
contRate = models.IntegerField(null=True)
cHpd = models.IntegerField(null=True)
cMpd = models.IntegerField(null=True)
cBph = models.IntegerField(null=True)


@property
def calc_rates(self):
    hpd = self.hours / self.wrkDays
    mpd = self.miles / self.wrkDays
    bph = self.boxes / hpd

    self.cHpd = hpd
    self.cMpd = mpd
    self.cBph = bhp

    super(Route, self).save()

Вам нужно свойство Model для каждого вычисляемого поля, например, так:

@property
def hpd(self):
    return self.hours / self.wrkDays

@property
def mpd(self):
    return self.miles / self.wrkDays

@property
def bph(self):
    return self.boxes / self.hpd

Если вы хотите сохранить его в базе данных, вы можете использовать signals. Тогда он будет вычисляться каждый раз, когда вы запускаете .save() на модели.

from django.db.models.signals import pre_save
from django.dispatch import receiver

@receiver(pre_save, sender=Route)
def my_callback(sender, instance, *args, **kwargs):
    instance.hpd = instance.hours / instance.wrkDays

Но, на мой взгляд, нет смысла сохранять его в базе данных, я бы удалил поля cHpd и т.д. и использовал решение, которое предложил Lewis.

Вернуться на верх