Django добавляет числа из базы данных и выводит на экран
У меня есть модель, которая берет значения из каждого дня. Я хотел бы добавить сумму этих чисел и отображать их под столбцами каждый раз, когда они складываются. Например: В некоторые дни у нас работает подъемник_рама, а в некоторые - нет. В конце месяца я хочу вывести общее количество дней, когда у нас был в эксплуатации подъемный_каркас. Может ли кто-нибудь помочь мне разобраться с этим или указать на документацию, которая объясняет сложение и отображение сумм в Django?
Вот мой текущий код:
model.py
class Day(models.Model):
day = models.DateField(auto_now=False)
well_name = models.ForeignKey("Well", on_delete=models.SET_NULL, null=True)
lift_frame = models.IntegerField(default=0)
mpd_manifold_building = models.IntegerField(default=0)
rcd_housing = models.IntegerField(default=0)
pipework = models.IntegerField(default=0)
mpd_supervisor = models.IntegerField(default=2)
mpd_operator = models.IntegerField(default=2)
def __str__(self):
return self.day.strftime("%d %B")
views.py
class Dayboard(LoginRequiredMixin, View):
def get(self, request):
days = Day.objects.all().order_by('day')
return render(request, 'days/dayboard.html', {'days': days})
dayboard.html
{% extends 'base/base.html' %}
{% block content %}
<div class="container">
<div class="d-flex justify-content-end m-4">
{% if user.is_superuser %}
<a href="{% url 'add-day' %}" class="btn btn-outline-info rounded">+</a>
{% endif %}
</div>
<table class="table table-hover">
<thead>
<tr>
<th scope="col">Date</th>
<th scope="col">Well</th>
<th scope="col">MPD</th>
<th scope="col">RCD</th>
<th scope="col">Pipe</th>
<th scope="col">LF</th>
<th scope="col">Sup</th>
<th scope="col">Op</th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
{% for day in days %}
<tr>
<th scope="row">{{ day.day}} </th>
<th>{{ day.well_name}} </th>
<td>{{ day.mpd_manifold_building }}</td>
<td>{{ day.rcd_housing }}</td>
<td>{{ day.pipework }}</td>
<td>{{ day.lift_frame }}</td>
<td>{{ day.mpd_supervisor }}</td>
<td>{{ day.mpd_operator }}</td>
<td><a class="nav-link text-info" href="{% url 'edit-day' day.id %}">Update</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock content %}
main.py
import sqlite3
import pandas as pd
cnx = sqlite3.connect('db.sqlite3')
df = pd.read_sql_query("SELECT * FROM project_day", cnx)
lift_frame_sum = df['lift_frame'].sum()
mpd_manifold_building_sum = df['mpd_manifold_building'].sum()
rcd_housing_sum = df['pipework'].sum()
pipework_sum = df['mpd_supervisor'].sum()
mpd_supervisor_sum = df['mpd_operator'].sum()
mpd_operator_sum = df['rcd_housing'].sum()
cnx.commit()
cnx.close()
Метод 1:
views.py
Обновите представление дневной доски, чтобы включить сумму lift_frame
:
from django.db.models import Sum
class Dayboard(LoginRequiredMixin, View):
def get(self, request):
days = Day.objects.all().order_by('day')
lift_sum = Day.objects.aggregate(total_lift_frame=Sum('lift_frame'))['total_lift_frame'] or 0
return render(request, 'days/dayboard.html', {'days': days, 'lift_sum': lift_sum})
Шаблон: dayboard.html
<strong>{{ lift_sum }}</strong>
Метод 2: Для вычисления и отображения сумм по всем полям можно определить метод, который вычисляет итог по всем полям:
from django.db.models import Sum
class Day(models.Model):
.....
@classmethod
def get_totals(cls):
"""
Returns a dictionary with the total sum of specified fields.
"""
fields_to_sum = [
"lift_frame",
"mpd_manifold_building",
"rcd_housing",
"pipework",
"mpd_supervisor",
"mpd_operator",
]
# Build a dictionary to aggregate sums for each field
totals = cls.objects.aggregate(**{f"total_{field}": Sum(field) for field in fields_to_sum})
# Replace None with 0 in the result
return {key: value or 0 for key, value in totals.items()}
views.py
Используйте метод get_totals в вашем представлении:
class Dayboard(LoginRequiredMixin, View):
def get(self, request):
days = Day.objects.all().order_by('day')
totals = Day.get_totals()
return render(request, 'days/dayboard.html', {'days': days, 'totals': totals})
dayboard.html
<td colspan="2" class="text-end"><strong>Totals:</strong>
{{ totals.total_mpd_manifold_building }}
{{ totals.total_rcd_housing }}
{{ totals.total_pipework }}
{{ totals.total_lift_frame }}
{{ totals.total_mpd_supervisor }}
{{ totals.total_mpd_operator }}
Просто используйте Sum
и aggregate
:
from django.db.models import Sum
qs = Day.objects.aggregate(
Sum('lift_frame'),
Sum('mpd_manifold_building'),
Sum('rcd_housing'),
...
)
print(qs)
# {'lift_frame__sum': 10, 'mpd_manifold_building__sum': 10, 'rcd_housing__sum': 10}
В конце месяца я хочу отобразить общее количество дней, в течение которых лифтовая_рамка находилась в эксплуатации
.
Day.objects.filter(day__range=['11-1-24', '11-31-24'], lift_frame__gt=0)
При этом я не понимаю вашего вопроса. Зачем вы используете pandas
? Для чего именно вам нужна Sum
?