Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Sumar valores de una columna (Django)
#1
Hola Compañeros, buen día.

Les cuento que estoy trabajando en una Aplicación de Control de Producción. Básicamente son Entradas y Salidas.

Esto ya está en models con sus respectivas bases de datos y los formularios desde el Front que permiten al usuario registrar los datos:

Código:
from django.db import models
from django.contrib.auth.models import User



class FinalProduct_in(models.Model):
    entry_number = models.AutoField('Entry Number', primary_key=True)
    dried_lsn_entry_amount = models.FloatField('Dried LSN Entry Amount')
    frass_entry_amount = models.FloatField('Frass LSN Entry Amount')  
    entry_date = models.DateField(auto_now=True)

    def __str__(self):
        return 'Entraron %s Kg de LSN Deshidratada y %s Kg de Frass LSN el día %s (self.dried_lsn_entry_amount, self.frass_entry_amount, self.entry_date)'


class FinalProduct_out(models.Model):
    entry_number = models.AutoField('Exit Number', primary_key=True)
    dried_lsn_exit_amount = models.FloatField('Dried LSN Exit Amount')
    frass_exit_amount = models.FloatField('Frass LSN Exit Amount')

    entry_date = models.DateField(auto_now=True)

    def __str__(self):
        return 'Salieron %s Kg de LSN Deshidratada y %s Kg de Frass LSN el día %s (self.dried_lsn_exit_amount, self.frass_exit_amount, self._entry_date)'



class Processing_in(models.Model):
    entry_number = models.AutoField('Entry Number', primary_key=True)
    live_lsn_entry_amount = models.FloatField('Live LSN Entry Amount')
    frass_entry_amount = models.FloatField('Frass Entry Amount')
    entry_date = models.DateField(auto_now=True)

    def __str__(self):
        return 'Entraron %s Kg de LSN Vivas y %s Kg de Frass el día %s (self.live_lsn_entry_amount, self.frass_entry_amount, self.entry_date)'

   


class Processing_out(models.Model):
    entry_number = models.AutoField('Exit Number', primary_key=True)
    dried_lsn_exit_amount = models.FloatField('Dried LSN Exit Amount')
    frass_exit_amount = models.FloatField('Frass Exit Amount')
    entry_date = models.DateField(auto_now=True)

    def __str__(self):
        return 'Salieron %s Kg de LSN Deshidratada el día %s (self.dried_lsn_exit_amount, self.frass_exit_amount, self.entry_date)'



class Bioconversion_in(models.Model):
    entry_number = models.AutoField('Entry Number', primary_key=True)
    substrate_entry_amount = models.FloatField('Substrate Entry Amount')
    neonates_entry_amount = models.FloatField('Neonates Entry Amount')

    entry_date = models.DateField(auto_now=True)

    def __str__(self):
        return 'Entraron %s Kg de Sustrato y %s Kg de Neonatos el día %s (self.substrate_entry_amount, self.neonates_entry_amount, self.entry_date)'


class Bioconversion_out(models.Model):
    entry_number = models.AutoField('Exit Number', primary_key=True)
    live_lsn_exit_amount = models.FloatField('Live Larvae Exit Amount')
    frass_exit_amount = models.FloatField('Neonates Exit Amount')
    entry_date = models.DateField(auto_now=True)

    def __str__(self):
        return 'Salieron %s Kg de Larva Viva y %s Kg de Frass el día %s (self.live_lsn_exit_amount, self.frass_exit_amount, self.entry_date)'



class RawMaterials_in(models.Model):
    entry_number = models.AutoField('Entry Number', primary_key=True)
    entry_amount = models.FloatField('Raw Material Entry Amount')
    entry_date = models.DateField(auto_now=True)

    def __str__(self):
        return 'Entraron %s Kg de Materias Primas el día %s (self.entry_amount, self.entry_date)'


class RawMaterials_out(models.Model):
    entry_number = models.AutoField('Exit Number', primary_key=True)
    exit_amount = models.FloatField('Substrarte Exit Amount')
    entry_date = models.DateField(auto_now=True)

    def __str__(self):
        return 'Salieron %s Kg de Substrato el día %s (self.exit_amount, self.entry_date)'



class Incubation_in(models.Model):
    entry_number = models.AutoField('Entry Number', primary_key=True)
    entry_amount = models.FloatField('Eggs Entry Amount')
    entry_date = models.DateField(auto_now=True)

    def __str__(self):
        return 'Entraron %s Kg de Huevos el día %s (self.entry_amount, self.entry_date)'


class Incubation_out(models.Model):
    entry_number = models.AutoField('Exit Number', primary_key=True)
    exit_amount = models.FloatField('Neonates Exit Amount')
    entry_date = models.DateField(auto_now=True)

    def __str__(self):
        return 'Salieron %s Kg de Neonatos el día %s (self.exit_amount, self.entry_date)'



class Breeding_in(models.Model):
    entry_number = models.AutoField('Entry Number', primary_key=True)
    pupae_entry_amount = models.FloatField('Pupae Entry Amount')

    #def __str__(self):
    #    return self.entry_number


class PruebaStats(models.Model):
    entry_number = models.AutoField('Entry Number', primary_key=True)
    test_eggs_exit_amount = models.FloatField('Test Eggs Exit Amount')

    #def __str__(self):
    #    return self.entry_number

    @property
    def total_eggs(self):
        return 8


class Breeding_out(models.Model):
    entry_number = models.AutoField('Entry Number', primary_key=True)
    eggs_exit_amount = models.FloatField('Eggs Exit Amount')

Ahora lo que deseo hacer específicamente es que en la página stats.html, el usuario pueda visualizar un resumen de la información y estadísticas de los datos que se registraron en la base de datos. Por ejemplo:

- Total Huevos Producidos.
- Total Producto Final que ha salido.

y que el usuario pueda seleccionar rangos específicos para estas consultas. Ej:

- Total Huevos Producidos en el Mes de Noviembre.
- Total Producto Final que salió el día 03/12/22.

Ya he logrado visualizar los datos de las Bases de datos en la página de destino, creando una lista en views.py de la App. Pero hasta ahí voy.

Creería que tengo que generar listas dentro de las función en views.py, pero ahí es donde me estoy complicando. Gracias de antemano por el apoyo Compañero.

Código:
from django.shortcuts import render
import calendar
from calendar import HTMLCalendar
from datetime import datetime
from services.models import Bioconversion_in, Breeding_out


def stats(request):
    resultados = Bioconversion_in.objects.all()
    salidas_reproduccion = Breeding_out.objects.all()


    return render(request, 'stats/stats.html', {
        'resultados': resultados,
        'salidas_reproduccion': salidas_reproduccion,
       
    })


Saludos
Responder
#2
Hola, ¿cómo estás?

Estas son consultas que se pueden hacer fácilmente con el ORM de Django. Por ejemplo, para obtener el total de salidas de Dried LSN y Frass LSN deberías sumar el valor de cada una de esas columnas en todas las filas de la tabla:

Código:
# En la consola interactiva de Django (python manage.py shell):
>>> from django.db.models import Sum
>>> FinalProduct_out.objects.aggregate(Sum("dried_lsn_exit_amount"), Sum("frass_exit_amount"))
{'dried_lsn_exit_amount__sum': 5.0, 'frass_exit_amount__sum': 3.0}

Si solo querés obtener las salidas de una fecha en particular, lo podés combinar con filter():

Código:
>>> import datetime
>>> fecha = datetime.date(day=3, month=12, year=22)
>>> FinalProduct_out.objects.filter(entry_date=fecha).aggregate(Sum("dried_lsn_exit_amount"), Sum("frass_exit_amount"))

Como bien decís, estos códigos deberían ir en tu vista y luego mandar sus resultados a la plantilla (nótese que el resultado es un diccionario). Ahora bien, si querés que el usuario seleccione la fecha del filtrado, tendrías que usar un formulario para recibir ese dato en la vista.

Si te manejás con el inglés (y si no, hay muchos tutoriales en español sobre el tema), acá está explicado cómo funcionan aggregate() y Sum: https://docs.djangoproject.com/en/dev/to...gregation/.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
(05-12-2022, 02:57 AM)Francisco escribió: Hola, ¿cómo estás?

Estas son consultas que se pueden hacer fácilmente con el ORM de Django. Por ejemplo, para obtener el total de salidas de Dried LSN y Frass LSN deberías sumar el valor de cada una de esas columnas en todas las filas de la tabla:

Código:
# En la consola interactiva de Django (python manage.py shell):
>>> from django.db.models import Sum
>>> FinalProduct_out.objects.aggregate(Sum("dried_lsn_exit_amount"), Sum("frass_exit_amount"))
{'dried_lsn_exit_amount__sum': 5.0, 'frass_exit_amount__sum': 3.0}

Si solo querés obtener las salidas de una fecha en particular, lo podés combinar con filter():

Código:
>>> import datetime
>>> fecha = datetime.date(day=3, month=12, year=22)
>>> FinalProduct_out.objects.filter(entry_date=fecha).aggregate(Sum("dried_lsn_exit_amount"), Sum("frass_exit_amount"))

Como bien decís, estos códigos deberían ir en tu vista y luego mandar sus resultados a la plantilla (nótese que el resultado es un diccionario). Ahora bien, si querés que el usuario seleccione la fecha del filtrado, tendrías que usar un formulario para recibir ese dato en la vista.

Si te manejás con el inglés (y si no, hay muchos tutoriales en español sobre el tema), acá está explicado cómo funcionan aggregate() y Sum: https://docs.djangoproject.com/en/dev/to...gregation/.

Saludos

Hola Compañero.

Muchas gracias.

Ya justo logré utilizar el aggregate para sumar los campos de una de mis tablas y presentarla en la vista.

Antes de generar el formulario para que el Usuario pueda hacer solicitudes específicas, voy a tratar de presentar los resultados Básicos y luego si me sigo complicando con la consultas más elaboradas.

Voy a trabajar en esto y les comparto mis avances en el transcurso de la semana.

Saludos
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)