[FIXED] Die Django-Abfrage schlägt mit einer _id fehl, die nicht verwendet, erstellt oder referenziert wird

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 ForeignKeybenötigt natürlich eine Spalte in der Datenbanktabelle. Da site_namees sich selbst um den Primärschlüssel handelt, sollten Sie diesen als ForeignKeyhier verwenden. Tatsächlich muss dies anstelle von ForeignKeya 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like