Ik werk al een tijdje met django en ik heb een behoorlijk moeilijke tijd gehad om de tafel-joins uit te zoeken, maar ik denk dat ik het eindelijk begrijp en ik wil dit graag doorgeven aan anderen zodat ze de frustratie kunnen vermijden die ik had ermee.
Overweeg het volgende 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'
Hier kunnen we zien dat location_id
in EventsBoardmeeting
is een refererende sleutel voor de id in EventsMeetinglocation
. Dit betekent dat we de informatie in EventsMeetinglocation
. moeten kunnen opvragen door EventsBoardmeeting
. te doorlopen .
Overweeg nu de volgende views.py:
def meetings(request):
meetingData = EventsBoardmeeting.objects.all()
return render(request, 'board/meetings.html', {'data': meetingData })
Zoals vele malen eerder vermeld in vele andere berichten, zorgt django automatisch voor joins. Wanneer we alles opvragen in EventsBoardmeeting
we krijgen ook alle gerelateerde informatie via een externe sleutel, maar de manier waarop we dit in html openen, is een beetje anders. We moeten de variabele doorlopen die als refererende sleutel wordt gebruikt om toegang te krijgen tot de informatie die bij die join hoort. Bijvoorbeeld:
{% for x in data %}
{{ x.location_id.name }}
{% endfor %}
Het bovenstaande verwijst naar ALLE namen in de tabel die het resultaat waren van de join op de externe sleutel. x
is in wezen de EventsBoardmeeting
tabel, dus wanneer we toegang krijgen tot x.location_id
we hebben toegang tot de externe sleutel die ons toegang geeft tot de informatie in EventsMeetinglocation
.