Как вычислить проценты из двух таблиц в Django

Яm pretty new to the Django Framework and I am stuck at calculating a percentage. Here проблема:

У меня есть две таблицы SocialCase и Donation:

class SocialCase(models.Model):

title = models.CharField(max_length=200)
profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
organizer = models.TextField(max_length=200, null=True, blank=False)
description = models.TextField(null=True, blank=False)
created = models.DateTimeField(auto_now_add=True)
profile_image = models.ImageField(upload_to='static/images/')
case_tags = models.ManyToManyField('events.Tag')
target_donation = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)

class Donation(models.Model):

user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
social_case = models.ForeignKey(SocialCase, on_delete=models.CASCADE)
raised = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)

Я хочу использовать метод @property для вычисления процента между raised и target_donation

  1. The target_donation field represents the total money needed for this social case. The target_donation will be set when the Social Case is created.
  2. The raised field represents the amount of money that has been currently raised. The raised field will be a dynamic value that will increment with each donation

Я хочу вычислить процент по модели SocialCase. Как мне взять колонку raised из модели Donations, чтобы вычислить процент каждого Social Case и вывести его в HTML шаблоне?

Большое спасибо, и извините, если это простой вопрос, яm still a newbie and couldn не нашел ничего в документации Django.

С уважением, Серджиу

Когда вы определяете ForeignKey, создается "обратное" поле на связанном объекте. Вы можете назвать его с помощью related_name, в противном случае по умолчанию используется <modelname>_set (имя модели пишется строчными буквами). В данном случае donation_set

Вероятно, именно этого вам не хватало. Код будет выглядеть примерно так

@property
def percent_raised(self):

    total = 0.0
    for donation in self.donation_set.all():
        total += float( donation.raised)

    return total / float( self.target_donation) * 100.0

В данном случае более эффективно, но гораздо менее обобщающе, вычислять сумму пожертвований в запросе к БД, используя функцию агрегирования. Смотрите шпаргалку здесь (третий пример с использованием Avg, но в этом случае вам понадобится Sum, а не Avg)

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