PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come si uniscono due tabelle su un campo di chiave esterna utilizzando django ORM?

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 .