Lavoro con django da un po' di tempo e ho avuto un periodo piuttosto difficile per capire le giunzioni del tavolo, ma penso di aver finalmente capito e vorrei passarlo ad altri in modo che possano evitare la frustrazione che ho avuto con esso.
Considera il seguente 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'
Qui possiamo vedere quel location_id
in EventsBoardmeeting
è una chiave esterna per l'id in EventsMeetinglocation
. Ciò significa che dovremmo essere in grado di interrogare le informazioni in EventsMeetinglocation
passando per EventsBoardmeeting
.
Ora considera il seguente views.py:
def meetings(request):
meetingData = EventsBoardmeeting.objects.all()
return render(request, 'board/meetings.html', {'data': meetingData })
Come affermato molte volte in altri post di maggio, django si occupa automaticamente dei join. Quando interroghiamo tutto in EventsBoardmeeting
otteniamo anche tutte le informazioni correlate tramite chiave esterna, ma il modo in cui accediamo a questo in html è leggermente diverso. Dobbiamo esaminare la variabile utilizzata come chiave esterna per accedere alle informazioni associate a quel join. Ad esempio:
{% for x in data %}
{{ x.location_id.name }}
{% endfor %}
Quanto sopra fa riferimento a TUTTI i nomi nella tabella che erano il risultato del join su chiave esterna. x
è essenzialmente il EventsBoardmeeting
tabella, quindi quando accediamo a x.location_id
stiamo accedendo alla chiave esterna che ci dà accesso alle informazioni in EventsMeetinglocation
.