Фильтрация определенных запросов в Django ORM
У меня возникают трудности с запросом определенных данных путем их фильтрации и последующего отображения в моем шаблоне. Я пытаюсь отобразить в своем шаблоне каждый филиал_cc из данного набора данных, который я уже загрузил, сколько кредитов было выдано для каждого филиала_cc с датой финансирования в 2021 году и общую сумму всех этих кредитов для каждого филиала_cc.
models.py
from django.db import models
class Loan(models.Model):
funded_date = models.DateTimeField(auto_now_add=False, blank=True)
respa_date = models.DateTimeField(auto_now_add=False, blank=True)
loan_amount = models.FloatField(null=True, blank=True, default=None)
branch_cc = models.IntegerField(default=0, blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
views.py
from django.shortcuts import render
from .models import Loan
import datetime
from django.db.models import Sum
def index(request):
# Funded Dates
all_loans = Loan.objects.all()
filter = Loan.objects.filter(funded_date__year=2021).count()
context = {
'all_loans': all_loans,
'filter': filter,
}
return render(request, 'index.html', context)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>
2021 Funded Date Loans
</h1>
<table class="table">
<thead>
<tr>
<th scope="col">Branch CC</th>
<th scope="col">Count</th>
<th scope="col">Amount</th>
</tr>
</thead>
<tbody>
{% for loan in all_loans %}
<tr>
<th scope="row">
{{loan.branch_cc}} <br>
</th>
{%endfor%}
</tr>
{% for count in filter %}
<tr>
<th scope="row">
{{count}}
</th>
{% endfor %}
</tr>
</tbody>
</table>
</body>
</html>
Вы можете использовать группировку по запросу. Например:
#view
from django.db.models import Sum, Count
branch_cc_with_loans = Loan.objects.filter(funded_date__year=2021).values('branch_cc').annotate(total=Sum('loan_amount'), loan_count=Count('id'))
context = {
'all_loans': all_loans,
'filter': filter,
'branch_cc_with_loans': branch_cc_with_loans
}
# template
{% for key, value in branch_cc_with_loans.items() %}
<thead>
<tr><th>{{key}}</th></tr>
</thead>
<tbody>
<tr>{{value}}</tr>
</tbody>
{% endfor %}
Здесь я группирую по branch_cc и аннотирую сумму loan_amount и количество id в кверисете значений. Затем я отправляю его в шаблон через контекст для рендеринга.
Для получения дополнительной информации, пожалуйста, обратитесь к документации.