Jeg har arbejdet med django i et stykke tid nu, og jeg har haft en temmelig hård tid med at finde ud af, at bordet slutter sig til, men jeg tror, at jeg endelig forstår det, og jeg vil gerne give dette videre til andre, så de kan undgå den frustration, jeg havde med det.
Overvej følgende 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'
Her kan vi se det location_id
i EventsBoardmeeting
er en fremmednøgle til id'et i EventsMeetinglocation
. Det betyder, at vi burde være i stand til at forespørge oplysningerne i EventsMeetinglocation
ved at gå gennem EventsBoardmeeting
.
Overvej nu følgende views.py:
def meetings(request):
meetingData = EventsBoardmeeting.objects.all()
return render(request, 'board/meetings.html', {'data': meetingData })
Som nævnt mange gange før i maj andre indlæg, tager django sig af joins automatisk. Når vi forespørger på alt i EventsBoardmeeting
vi får også alle relaterede oplysninger med fremmednøgle, men måden vi får adgang til dette i html er lidt anderledes. Vi er nødt til at gennemgå den variabel, der bruges som fremmednøgle for at få adgang til de oplysninger, der er knyttet til det join. For eksempel:
{% for x in data %}
{{ x.location_id.name }}
{% endfor %}
Ovenstående refererer til ALLE navnene i tabellen, der var resultatet af joinforbindelsen på fremmednøgle. x
er i bund og grund EventsBoardmeeting
tabel, så når vi tilgår x.location_id
vi får adgang til den fremmednøgle, som giver os adgang til oplysningerne i EventsMeetinglocation
.