Eu tenho trabalhado com django por um tempo agora e tive um tempo muito difícil para descobrir as junções de tabelas, mas acho que finalmente entendi e gostaria de passar isso para outras pessoas para que possam evitar a frustração que eu tive com isso.
Considere o seguinte model.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'
Aqui podemos ver que
location_id
em EventsBoardmeeting
é uma chave estrangeira para o id em EventsMeetinglocation
. Isso significa que devemos ser capazes de consultar as informações em EventsMeetinglocation
passando por EventsBoardmeeting
. Agora considere as seguintes views.py:
def meetings(request):
meetingData = EventsBoardmeeting.objects.all()
return render(request, 'board/meetings.html', {'data': meetingData })
Como dito muitas vezes antes em outros posts, o django cuida das junções automaticamente. Quando consultamos tudo em
EventsBoardmeeting
também obtemos qualquer informação relacionada por chave estrangeira, mas a maneira como acessamos isso em html é um pouco diferente. Temos que passar pela variável usada como chave estrangeira para acessar as informações associadas a essa junção. Por exemplo:{% for x in data %}
{{ x.location_id.name }}
{% endfor %}
O acima referencia TODOS os nomes na tabela que foram o resultado da junção na chave estrangeira.
x
é essencialmente o EventsBoardmeeting
table, então quando acessamos x.location_id
estamos acessando a chave estrangeira que nos dá acesso às informações em EventsMeetinglocation
.