Поле свойства модели Django вычисляется с помощью поля из другой дочерней модели

class BusinessFunction(models.Model):
     name = models.CharField(max_length=200)
     priority_rating = models.PositiveIntegerField(null=True, blank=True)
     location = models.CharField(max_length=200)
     network_service_related = models.CharField(max_length=200)

     class Meta:
         ordering = ['name']

     def __str__(self):
         return self.name

class CriticalImpact(models.Model):
     businessfunction = models.ForeignKey(BusinessFunction, on_delete=models.CASCADE)
     priority = models.PositiveSmallIntegerField(null=True, blank=True)
     financial = models.PositiveSmallIntegerField(null=True, blank=True)
     legal = models.PositiveSmallIntegerField(null=True, blank=True)
     score = models.PositiveSmallIntegerField(null=True, blank=True)
     percentage = models.PositiveIntegerField(null=True, blank=True)

     class Meta:
         ordering = ['businessfunction']

class TimeImpact(models.Model):
     businessfunction = models.ForeignKey(BusinessFunction, on_delete=models.CASCADE)
     impact_score_financial = models.DecimalField(max_digits=5, decimal_places=2, blank=True, 
     null=True)
     impact_score_asset = models.DecimalField(max_digits=5, decimal_places=2, 
     blank=True, null=True)
     final_score = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)

     class Meta:
         ordering = ['businessfunction']
     
     @property
     def final_rating(self):
         final_rating = (self.final_score + ????????)/2
         return  final_rating

У меня есть код, как показано выше, и я хотел бы добавить свойство итоговой оценки, используя вычисления из собственной таблицы (TimeImpact) поле final_score и поле из CriticalImpact поле т.е. процент. Проблема в том, как я могу получить поле percentage из таблицы CriticalImpact, которая является дочерней для таблицы бизнес-функций. Я искал раньше, но большинство ответов - это вычисляемое поле, исходящее из поля в собственной таблице и родительской таблице, а не из другой дочерней таблицы.

В настоящее время у вас нет связи, сделайте ForeignKey в модели TimeImpact, которая будет иметь связь Many-to-One с моделью CriticalImpact, затем вы можете взять поле percentage через цепочку, так:

class TimeImpact(models.Model):
     businessfunction = models.ForeignKey(BusinessFunction, on_delete=models.CASCADE)
     impact_score_financial = models.DecimalField(max_digits=5, decimal_places=2, blank=True, 
     null=True)
     impact_score_asset = models.DecimalField(max_digits=5, decimal_places=2, 
     blank=True, null=True)
     final_score = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True)
     critical_impact=models.ForeignKey(CriticalImpact,on_delete=models.CASCADE)

     class Meta:
         ordering = ['businessfunction']

     @property
     def final_rating(self):
         final_rating = (self.final_score + self.critical_impact.percentage)/2
         return  final_rating
Вернуться на верх