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?

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