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.