Pracuję z django już od jakiegoś czasu i miałem dość trudny czas, zastanawiając się nad połączeniami przy stole, ale myślę, że w końcu rozumiem i chciałbym przekazać to innym, aby mogli uniknąć frustracji, którą miałem z nim.
Rozważ następujący 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'
Tutaj widzimy, że location_id
w EventsBoardmeeting
jest kluczem obcym dla identyfikatora w EventsMeetinglocation
. Oznacza to, że powinniśmy mieć możliwość zapytania o informacje w EventsMeetinglocation
przechodząc przez EventsBoardmeeting
.
Rozważmy teraz następujący plik views.py:
def meetings(request):
meetingData = EventsBoardmeeting.objects.all()
return render(request, 'board/meetings.html', {'data': meetingData })
Jak już wielokrotnie pisano w wielu innych postach, django automatycznie zajmuje się przyłączeniami. Kiedy pytamy o wszystko w EventsBoardmeeting
otrzymujemy również wszelkie powiązane informacje za pomocą klucza obcego, ale sposób, w jaki uzyskujemy dostęp do tego w html, jest trochę inny. Musimy przejść przez zmienną używaną jako klucz obcy, aby uzyskać dostęp do informacji związanych z tym złączeniem. Na przykład:
{% for x in data %}
{{ x.location_id.name }}
{% endfor %}
Powyższe odwołuje się do WSZYSTKICH nazw w tabeli, które były wynikiem sprzężenia na kluczu obcym. x
jest zasadniczo EventsBoardmeeting
tabeli, więc kiedy uzyskujemy dostęp do x.location_id
uzyskujemy dostęp do klucza obcego, który daje nam dostęp do informacji w EventsMeetinglocation
.