PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak połączyć dwie tabele w polu klucza obcego za pomocą django ORM?

Pracuję z django już od jakiegoś czasu i miałem dość trudny czas, zastanawiając się nad połączeniami przy stole, ale myślę, że w końcu rozumiem i chciałbym przekazać to innym, aby mogli uniknąć frustracji, którą miałem z nim.

Rozważ następujący 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'

Tutaj widzimy, że location_id w EventsBoardmeeting jest kluczem obcym dla identyfikatora w EventsMeetinglocation . Oznacza to, że powinniśmy mieć możliwość zapytania o informacje w EventsMeetinglocation przechodząc przez EventsBoardmeeting .

Rozważmy teraz następujący plik views.py:

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

Jak już wielokrotnie pisano w wielu innych postach, django automatycznie zajmuje się przyłączeniami. Kiedy pytamy o wszystko w EventsBoardmeeting otrzymujemy również wszelkie powiązane informacje za pomocą klucza obcego, ale sposób, w jaki uzyskujemy dostęp do tego w html, jest trochę inny. Musimy przejść przez zmienną używaną jako klucz obcy, aby uzyskać dostęp do informacji związanych z tym złączeniem. Na przykład:

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

Powyższe odwołuje się do WSZYSTKICH nazw w tabeli, które były wynikiem sprzężenia na kluczu obcym. x jest zasadniczo EventsBoardmeeting tabeli, więc kiedy uzyskujemy dostęp do x.location_id uzyskujemy dostęp do klucza obcego, który daje nam dostęp do informacji w EventsMeetinglocation .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zaktualizować bazę danych postgresql z 10 do 12 bez utraty danych dla openproject?

  2. PostgreSQL — musi występować w klauzuli GROUP BY lub być używany w funkcji agregującej

  3. postgresql - zamień wszystkie wystąpienia ciągu w polu tekstowym

  4. Jak obliczyć percentyl w PostgreSQL

  5. Czy PostgreSQL obsługuje przezroczystą kompresję tabel (fragmentów)?