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
.