Как вычислить проценты из двух таблиц в 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
- 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.
- 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
)