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.

Solicitud de unión en Django entre tres tablas y mostrar todos los atributos.

Tengo tres modelos

class A(models.Model):
   campo1 = models.IntegerField()

class B(models.Model):
   id_a = models.ForeignKey(A,on_delete=models.CASCADE)
   campo1 = models.IntegerField()
   campo2 = models.IntegerField()

class C(models.Model):
   id_a = models.ForeignKey(A,on_delete=models.CASCADE)
   campo1 = models.IntegerField()
   campo2 = models.IntegerField()

Quiero escribir una consulta que se vea así: SELECT * FROM B,C,A WHERE B.id_a=C.id_a WHERE A.id_a=2 y mostrar todos los atributos de las dos tablas. Aquí está lo que intenté hacer:

a_id_att = 1
data = B.objects.filter(id_a=C.objects.filter(id_a=a_id_att)[0])

No funciona. ¿Cómo escribir el “join” y hacer que se muestren todos los atributos de las tablas?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para unir los tres modelos A, B y C, y mostrar todos sus atributos, puedes utilizar la API de consultas de Django y la función select_related(). Aquí tienes un ejemplo de código que puede lograr esto:

    data = B.objects.select_related('id_a', 'id_a__c').filter(id_a__id=a_id_att, id_a__c__isnull=False)
    for item in data:
        print(item.id_a.field1, item.field1, item.field2, item.id_a.c.field1, item.id_a.c.field2)
    

    En este código, primero usamos select_related() para recuperar los campos relacionados de A y C para cada objeto B. Luego filtramos basándonos en la id de A que queremos utilizar (a_id_att) y también nos aseguramos de que cada objeto B tenga un objeto C correspondiente (utilizando el filtro __isnull=False). Finalmente, podemos recorrer los datos e imprimir todos los atributos de los tres modelos según lo deseado.

Comments are closed.