es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo hacer una consulta compleja en Django?

¡Hola a todos!

Soy nuevo en Django y estoy confundido, ¡aprecio cualquier ayuda! Estoy intentando crear una tabla, como esta:

Organización Formulario de apelación Cantidad de apelaciones en este formulario
Organización 1 En forma escrita 1
Organización 2 En forma oral 1

Tengo tres modelos:

class Organization(models.Model):
    nombre_organización = models.CharField(max_length=50)</p>

<p>class AppealForm(models.Model):
    nombre_formulario = models.CharField(max_length=50)</p>

<p>class Appeal(models.Model):
    organización = models.ForeignKey(Organization, on_delete=models.CASCADE)
    formulario_apelación = models.ForeignKey(AppealForm, on_delete=models.CASCADE)
    nombre_solicitante = models.CharField(max_length=150)

Objetos del modelo Organization:

nombre_organización
Organización 1
Organización 2

Objetos del modelo AppealForm:

nombre_formulario
En forma escrita
En forma oral

Objetos del modelo Appeal:

organización formulario_apelación nombre_solicitante
Organización 1 En forma escrita Mary Elizabeth Smith
Organización 2 En forma oral Ada María Guerrero

¿Cómo hacer una consulta compleja para recuperar información del modelo de Apelación? ¿Y colocarla en los campos exactos de la tabla de arriba? 🙁

#

Nueva tabla en index.html

Organización Cantidad total de apelaciones Cantidad de apelaciones en forma escrita Cantidad de apelaciones en forma oral
Organización 1 10 1 9
Organización 2 5 4 1
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para recuperar la información requerida del modelo Appeal y colocarla en la nueva tabla, necesitamos utilizar las funciones de agregación de Django. La siguiente consulta debería funcionar:

    from django.db.models import Count, Q
    
    appeals = Appeal.objects.annotate(
        total_appeals=Count('id'),
        written_form_appeals=Count('id', filter=Q(appeal_form__form_name='En forma escrita')),
        oral_form_appeals=Count('id', filter=Q(appeal_form__form_name='En forma oral'))
    ).values(
        'organization__organization_name',
        'total_appeals',
        'written_form_appeals',
        'oral_form_appeals'
    )
    

    Esta consulta generará anotaciones para el número total de apelaciones, el número de apelaciones en forma escrita y el número de apelaciones en forma oral. Luego agrupará los resultados por organización y recuperará los campos requeridos:
    – organization_name
    – total_appeals
    – written_form_appeals
    – oral_form_appeals

    Luego podemos pasar el conjunto de consultas appeals a la plantilla y renderizarlo en la tabla según sea necesario.

Comments are closed.