Как мне разделить стоимость на отрезок времени (скажем, 12 месяцев), чтобы вернуть ежемесячную стоимость - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь сделать этот расчет: разделите стоимость на отрезок времени (скажем, 12 месяцев), чтобы получить месячную стоимость. Я могу вернуть значение из БД, но я делаю это совершенно неправильно, и я застрял. Я также попытался использовать аннотацию вместо агрегата без удачи.

Из views.py

def dashboard(request):
 total_cost = Apprentice.objects.all().aggregate(Sum('cost__cost'))['cost__cost__sum']
 monthly_cost = Apprentice.objects.all().aggregate(Sum('p_time__duration'))['p_time__duration__sum']
 return render(request, 'dashboard.html', {'total_cost': total_cost, 'monthly_cost': monthly_cost})

Из шаблона

    <div class="card">
      <div class="card-body">
        <h5 class="card-title">Total monthly spend</h5>
        <p class="card-text"><strong></strong>£{{ monthly_cost | intcomma }}</strong></p>
      </div>
    </div>

Из models.py

from django.db import models
from django.utils import timezone



class Division(models.Model):
 name = models.CharField(max_length=255)

 def __str__(self):
     return self.name


class Department(models.Model):
 name = models.CharField(max_length=255, unique=True)
 division = models.ForeignKey(Division, on_delete=models.CASCADE)

 def __str__(self):
     return self.name


class Programme(models.Model):
 p_name = models.CharField(max_length=255, unique=True)

 def __str__(self):
     return self.p_name


class ProgrammeDuration(models.Model):
 program = models.ForeignKey(Programme, unique=True, 
 on_delete=models.CASCADE)
 duration = models.IntegerField()

def __str__(self):
    return str(self.duration)


class Cost(models.Model):
p_name = models.ForeignKey(Programme, related_name='cost', 
on_delete=models.CASCADE)
cost = models.IntegerField()

def __str__(self):
    return str(self.cost)


class Apprentice(models.Model):
 name = models.CharField(max_length=255)
 email = models.CharField(max_length=255)
 role = models.CharField(max_length=255)
 p_name = models.ForeignKey(Programme, related_name='name', 
on_delete=models.CASCADE)
 p_time = models.ForeignKey(ProgrammeDuration, on_delete=models.CASCADE)
 dept = models.ForeignKey(Department, on_delete=models.CASCADE)
 div = models.ForeignKey(Division, on_delete=models.CASCADE)
 cost = models.ForeignKey(Cost, on_delete=models.CASCADE)
 date_created = models.DateTimeField(default=timezone.now)
 on_course = models.BooleanField(null=True)
 left_course = models.BooleanField(null=True)
 start_date = models.DateTimeField(null=True)
 finish_date = models.DateTimeField(null=True)
 notes = models.TextField(null=True)

 def __str__(self):
     return self.name

Ввод из дБ

enter image description here

enter image description here

Rendered html

enter image description here

Таким образом, я пытаюсь разделить стоимость на продолжительность в месяцах, чтобы вернуть ежемесячную стоимость.

1 Ответ

0 голосов
/ 21 января 2020

У вас неверное значение в month_cost, это total_duration, а не month_cost. Для получения ежемесячной стоимости необходимо разделить стоимость __ стоимости ___ суммы на p_time__duration__sum:

total_cost = Apprentice.objects.all().aggregate(Sum('cost__cost'))['cost__cost__sum'] 
total_duration = Apprentice.objects.all().aggregate(Sum('p_time__duration'))['p_time__duration__sum'] 
monthly_cost = total_cost/ total_duration 
...