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

#python #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)
 

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

 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 %} 
 

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

Ответ №1:

Как я и предполагал, у вас есть запрос на 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>
 

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

Комментарии:

1. @Sbil. Спасибо за ваш ответ, но после запуска скрипта в браузере появляется ошибка: неподдерживаемые типы операндов для -: «Набор запросов» и «Набор запросов».

2. для чего предназначен тип данных total_monthly_income, total_monthly_expenses, net_monthly_income ?

3. они являются позитивными в Эгерфилде . total_monthly_income и total_monthly_expenses являются переменными, содержащими поле «сумма» суммы из этих моделей, и они являются полем PositiveIntegerField (поле модели суммы), в то время как net_monthly_income-это переменная, которую я ожидаю для вычисления (разница между ними).

4. можно ли распечатать данные, указанные в вашем вопросе?

5. Не совсем понимаю, что вы имеете в виду, но я хочу распечатать результаты расчета в своем шаблоне