#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. Не совсем понимаю, что вы имеете в виду, но я хочу распечатать результаты расчета в своем шаблоне