Как я могу получить ежемесячные доходы, расходы, чистый доход и отобразить их в шаблоне django с помощью цикла

Я работаю над проектом Django с двумя моделями; Расходы и Доходы. Я хочу получить Общий доход, Общие расходы и Чистый доход за каждый месяц, перемещенный в таблицу. Чистый доход должен быть равен Общий доход минус (-) Общие расходы. И вот у меня есть эти модели (Доход и Расход одинаковые), имеющие одинаковые свойства, как показано ниже

class Income(models.Model):
      description = models.CharField(max_length=100, null=False)
      category = models.CharField(max_length=100, choices=CATEGORY_INCOME, null=True)
      staff = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
      amount = models.PositiveIntegerField(null=False)
      remarks = models.CharField(max_length=120, null=True)
      date = models.DateField(auto_now_add=False, auto_now=False, null=False)
      addedDate = models.DateTimeField(auto_now_add=True)

Вот что я пробовал в своем файле views:

def monthly_Income(request):
total_monthly_income = Income.objects.annotate(month=TruncMonth('date')).values('month').annotate(total_monthly_income=Sum('amount'))
total_monthly_expenses = Expenditure.objects.annotate(month=TruncMonth('date')).values('month').annotate(total_monthly_expenses=Sum('amount'))
net_monthly_income = total_monthly_income - total_monthly_expenses
context = {
    'total_monthly_income': total_monthly_income,
    'total_monthly_expenses':total_monthly_expenses,
'net_monthly_income':net_monthly_income'
}

В моем шаблоне django вот как я пытаюсь отобразить результаты.

{% for income in total_monthly_income %}
{{ income.total_monthly_income | intcomma }}
{{ total_monthly_expenses }}
{{ net_monthly_income }}
 {% endfor %} 

Проблема в том, что я могу получить общий месячный доход, но не могу получить общие месячные расходы и чистый доход по каждому месяцу года. Кто-то должен любезно помочь мне получить правильный результат соответственно.

Как я догадался, у вас есть набор запросов для total_monthly_income и total_monthly_expenses. Поэтому я обновил вашу функцию следующим образом

просматривает изменения:

def monthly_Income(request):

    #Get Day of today from current date and time
    now = datetime.datetime.now()

    total_monthly_income = Income.objects.annotate(month=TruncMonth('date')).values('month').annotate(total_monthly_income=Sum('amount'))
    total_monthly_expenses = Expenditure.objects.annotate(month=TruncMonth('date')).values('month').annotate(total_monthly_expenses=Sum('amount'))
    income_expense = zip(total_monthly_income, total_monthly_expenses)
    
    net_monthly_income_list = []
    
    for income, expense in income_expense:
        net_monthly_income_list.append(income.get('total_monthly_income', 0) - expense.get('total_monthly_expenses', 0))
    
    income_list = zip(total_monthly_income, total_monthly_expenses, net_monthly_income_list)
    
    context = {
        'income_list': income_list
    }

    return render(request, 'cashier/view_income_monthly.html', context)

Также требуется внести некоторые изменения в файл шаблона следующим образом:

<tbody>
    {% for total_monthly_income, total_monthly_expenses, net_monthly_income in income_list %}
        <tr>
            <th scope="row">{{ forloop.counter }}</th>
            <td nowrap>{{ total_monthly_income.month }}</td>
            <td nowrap>{{ total_monthly_income.total_monthly_income | intcomma }}</td>
            <td >{{ total_monthly_expenses.total_monthly_expenses | intcomma }}</td>
            <td >{{ net_monthly_income | intcomma }}</td>
        
            <td nowrap>
                <a class="btn btn-info btn-sm" href="#">Edit</a>
                <a class="btn btn-danger btn-sm" href="#">Delete</a>
            </td>
        </tr>
    {% endfor %}             
</tbody>

Надеюсь, теперь это должно работать для вас :)

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