sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo se unen dos tablas en un campo de clave externa usando django ORM?

He estado trabajando con django durante un tiempo y me ha costado bastante descifrar las uniones de la tabla, pero creo que finalmente lo entiendo y me gustaría pasar esto a otros para que puedan evitar la frustración que tuve. con eso.

Considere el siguiente modelo.py:

class EventsMeetinglocation(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)
    address = models.CharField(max_length=200)

    class Meta:
        managed = True
        db_table = 'events_meetinglocation'

class EventsBoardmeeting(models.Model):
    id = models.IntegerField(primary_key=True)
    date = models.DateTimeField()
    agenda_id = models.IntegerField(blank=True, null=True)
    location_id = models.ForeignKey(EventsMeetinglocation)
    minutes_id = models.IntegerField(blank=True, null=True)

    class Meta:
       managed = True
       db_table = 'events_boardmeeting'

Aquí podemos ver que location_id en EventsBoardmeeting es una clave externa para la identificación en EventsMeetinglocation . Esto significa que deberíamos poder consultar la información en EventsMeetinglocation visitando EventsBoardmeeting .

Ahora considere las siguientes vistas.py:

def meetings(request):
    meetingData = EventsBoardmeeting.objects.all()
    return render(request, 'board/meetings.html', {'data': meetingData })

Como se indicó muchas veces antes en muchas otras publicaciones, django se encarga de las uniones automáticamente. Cuando consultamos todo en EventsBoardmeeting también obtenemos cualquier información relacionada por clave externa, pero la forma en que accedemos a esto en html es un poco diferente. Tenemos que pasar por la variable utilizada como clave externa para acceder a la información asociada con esa combinación. Por ejemplo:

{% for x in data %}
   {{ x.location_id.name }}
{% endfor %}

Lo anterior hace referencia a TODOS los nombres en la tabla que fueron el resultado de la unión en clave externa. x es esencialmente la EventsBoardmeeting tabla, por lo que cuando accedemos a x.location_id estamos accediendo a la clave externa que nos da acceso a la información en EventsMeetinglocation .