Ausgabe
Ich habe das Abfrageset schon einmal verwendet, obwohl dies mein erster Versuch ist, Tabellen zu JOIN, aber es funktioniert bisher nicht. Ich verwende Django 3.2 und Python 3.8.1
Meine Modelle.py
class Mainjoinbook(models.Model):
fullsitename = models.TextField(primary_key=True)
creationdate = models.DateTimeField()
entrytypeid = models.BigIntegerField(blank=True, null=True)
title = models.TextField(blank=True, null=True)
tickettype = models.TextField(blank=True, null=True)
ticket = models.TextField(blank=True, null=True)
status = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'mainlogbook'
class Sitelocation(models.Model):
site_name = models.TextField(primary_key=True)
latitude = models.TextField(blank=True, null=True)
longitude = models.TextField(blank=True, null=True)
sites = models.ForeignKey(Mainjoinbook, on_delete=models.DO_NOTHING)
class Meta:
managed = False
db_table = 'tblsiteaccess'
Ich versuche, alle Werte aus beiden Tabellen in meiner views.py zusammenzuführen
qrylocations = Sitelocation.objects.select_related('sites').filter(sites__status='OPEN')
Dies führt zu diesem Fehler, da diese Spalte von Django erstellt wird, aber nicht zur Tabelle gehört. Ich kann immer noch nicht herausfinden, wie ich das lösen kann, da ich viele Optionen ausprobiert habe, aber immer eine Art Fehler bekomme, und ich hoffe, jemand kann mir helfen, zu sehen, was ich falsch mache, wenn ich die Tabellen mit den definierten Primärschlüsseln verbinde
psycopg2.errors.UndefinedColumn: column tblsiteaccess.sites_id does not exist
Die angezeigte SQL-Ausgabe ist wie folgt.
Ausgabe von qrylocations.query
SELECT "tblsiteaccess"."site_name", "tblsiteaccess"."latitude", "tblsiteaccess"."longitude", "tblsiteaccess"."sites_id", "mainlogbook"."fullsitename", "mainlogbook"."log_id", "mainlogbook"."creationdate", "mainlogbook"."entrytypeid", "mainlogbook"."title", "mainlogbook"."tickettype", "mainlogbook"."ticket", "mainlogbook"."status" FROM "tblsiteaccess" INNER JOIN "mainlogbook" ON ("tblsiteaccess"."sites_id" = "mainlogbook"."fullsitename") WHERE "mainlogbook"."status" = OPEN
Lösung
A ForeignKey
benötigt natürlich eine Spalte in der Datenbanktabelle. Da site_name
es sich selbst um den Primärschlüssel handelt, sollten Sie diesen als ForeignKey
hier verwenden. Tatsächlich muss dies anstelle von ForeignKey
a OneToOneField
[Django docs] sein , da es auch ein Primärschlüssel ist und eindeutig sein muss:
class Sitelocation(models.Model):
site_name = models.OneToOneField(
Mainjoinbook,
on_delete=models.CASCADE,
primary_key=True,
db_column='site_name'
)
latitude = models.TextField(blank=True, null=True)
longitude = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'tblsiteaccess'
Beantwortet von – Abdul Aziz Barkat
Antwort geprüft von – Candace Johnson (FixError Volunteer)