Je travaille avec django depuis un moment maintenant et j'ai eu du mal à comprendre les jointures de table, mais je pense que j'ai enfin compris et j'aimerais transmettre cela à d'autres afin qu'ils puissent éviter la frustration que j'avais avec elle.
Considérez le model.py suivant :
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'
Ici, nous pouvons voir que location_id
dans EventsBoardmeeting
est une clé étrangère pour l'identifiant dans EventsMeetinglocation
. Cela signifie que nous devrions pouvoir interroger les informations dans EventsMeetinglocation
en passant par EventsBoardmeeting
.
Considérez maintenant le fichier views.py suivant :
def meetings(request):
meetingData = EventsBoardmeeting.objects.all()
return render(request, 'board/meetings.html', {'data': meetingData })
Comme indiqué à plusieurs reprises dans d'autres messages, Django s'occupe automatiquement des jointures. Lorsque nous interrogeons tout dans EventsBoardmeeting
nous obtenons également toutes les informations connexes par clé étrangère, mais la façon dont nous y accédons en html est un peu différente. Il faut passer par la variable utilisée comme clé étrangère pour accéder aux informations associées à cette jointure. Par exemple :
{% for x in data %}
{{ x.location_id.name }}
{% endfor %}
Ce qui précède fait référence à TOUS les noms de la table résultant de la jointure sur clé étrangère. x
est essentiellement le EventsBoardmeeting
table, donc quand nous accédons à x.location_id
nous accédons à la clé étrangère qui nous donne accès aux informations dans EventsMeetinglocation
.