PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment joindre deux tables sur un champ de clé étrangère à l'aide de Django ORM ?

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 .