sql >> Database >  >> RDS >> PostgreSQL

Hoe voeg je twee tabellen samen in een veld met een externe sleutel met django ORM?

Ik werk al een tijdje met django en ik heb een behoorlijk moeilijke tijd gehad om de tafel-joins uit te zoeken, maar ik denk dat ik het eindelijk begrijp en ik wil dit graag doorgeven aan anderen zodat ze de frustratie kunnen vermijden die ik had ermee.

Overweeg het volgende 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'

Hier kunnen we zien dat location_id in EventsBoardmeeting is een refererende sleutel voor de id in EventsMeetinglocation . Dit betekent dat we de informatie in EventsMeetinglocation . moeten kunnen opvragen door EventsBoardmeeting . te doorlopen .

Overweeg nu de volgende views.py:

def meetings(request):
    meetingData = EventsBoardmeeting.objects.all()
    return render(request, 'board/meetings.html', {'data': meetingData })

Zoals vele malen eerder vermeld in vele andere berichten, zorgt django automatisch voor joins. Wanneer we alles opvragen in EventsBoardmeeting we krijgen ook alle gerelateerde informatie via een externe sleutel, maar de manier waarop we dit in html openen, is een beetje anders. We moeten de variabele doorlopen die als refererende sleutel wordt gebruikt om toegang te krijgen tot de informatie die bij die join hoort. Bijvoorbeeld:

{% for x in data %}
   {{ x.location_id.name }}
{% endfor %}

Het bovenstaande verwijst naar ALLE namen in de tabel die het resultaat waren van de join op de externe sleutel. x is in wezen de EventsBoardmeeting tabel, dus wanneer we toegang krijgen tot x.location_id we hebben toegang tot de externe sleutel die ons toegang geeft tot de informatie in EventsMeetinglocation .



  1. Hoe de BINARY-operator werkt in MariaDB

  2. AT TIME ZONE gebruiken om een ​​oud rapport te herstellen

  3. Meerdere PostgreSQL-servers installeren op RedHat Linux

  4. Een jaar aftrekken van een datum in MariaDB