S django pracuji už nějakou dobu a měl jsem docela těžké chvíle, když jsem zjistil, jak se ke stolu připojit, ale myslím, že to konečně chápu a rád bych to předal ostatním, aby se vyhnuli frustraci, kterou jsem měl já s tím.
Zvažte následující 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'
Zde vidíme location_id
v EventsBoardmeeting
je cizí klíč pro id v EventsMeetinglocation
. To znamená, že bychom měli být schopni dotazovat se na informace v EventsMeetinglocation
pomocí EventsBoardmeeting
.
Nyní zvažte následující views.py:
def meetings(request):
meetingData = EventsBoardmeeting.objects.all()
return render(request, 'board/meetings.html', {'data': meetingData })
Jak již bylo mnohokrát uvedeno v jiných květnových příspěvcích, django se o připojení stará automaticky. Když se zeptáme na vše v EventsBoardmeeting
veškeré související informace získáváme také cizím klíčem, ale způsob, jakým k tomu přistupujeme v html, je trochu jiný. Pro přístup k informacím spojeným s tímto spojením musíme projít proměnnou používanou jako cizí klíč. Například:
{% for x in data %}
{{ x.location_id.name }}
{% endfor %}
Výše uvedené odkazy na VŠECHNY názvy v tabulce, které byly výsledkem spojení cizího klíče. x
je v podstatě EventsBoardmeeting
tabulka, takže když přistupujeme k x.location_id
přistupujeme k cizímu klíči, který nám umožňuje přístup k informacím v EventsMeetinglocation
.