/ Ich verbinde zwei Tabellen in Django ORM mit einem Fremdschlüssel - Python, Django, Django-Modelle, Django-Orm

Join zwei Tabellen in Django ORM mit Fremdschlüssel - Python, Django, Django-Modelle, Django-Orm

Ich bin ein Anfänger in Django. Ich habe ein Problem mit Modellen, die über Foregin Keys verbunden sind.

Ich habe zwei Modelle "Internalorder2" und "Position3" wie unten erwähnt. Ich möchte die Tabellen mit Django ORM verbinden.

class Internalorder2(models.Model):
order_id = models.AutoField(primary_key=True)
ticker = models.CharField(max_length=64)

class Meta:
managed = True
db_table = "internalorder2"

app / models.py

class Position3(models.Model):
pos_id = models.AutoField(primary_key=True)
parent_order = models.OneToOneField(Internalorder2, models.DO_NOTHING)
action = models.CharField(max_length=4)

class Meta:
managed = True
db_table = "position3"

Als nächstes habe ich beide Tabellen ausgefüllt. Danach führe ich eine Abfrage zum Extrahieren aus Ein Abfragesatz, der beide Tabellen mit der Funktion select_related abdeckt. Ich hatte erwartet, alle Felder der Tabelle Internalorder2 in Queryset aus der Abfrage zu sehen. Jedoch, Das Abfrageset enthält nur die Felder aus seiner eigenen Tabelle, Position3.

Shell-Befehl python manage.py

from app.models.py import *
qs= Position3.objects.all().select_related("parent_order")

Python-Shell-Ergebnis

In [102]: qs[0].__dict__

Out[102]:
{"_parent_order_cache": <Internalorder2: Internalorder2 object>,
"_state": <django.db.models.base.ModelState at 0x13209f0>,
"action": "B",
"parent_order_id": 1,
"pos_id": 1}

Ich kann auf die zugreifen Felder aus der Tabelle Internalorder2 mit dem Befehl:

Python-Shell-Ergebnis

In [112]: qs[0].parent_order.ticker
Out[112]: "ACC"

Dies ist jedoch nicht das, was ich will. Ich möchte, dass alle Felder aus der Foregin-Tabelle zu Queryset hinzugefügt werden, wie z Queryset wird als Eingabe an ein anderes Plugin weitergeleitet.

Gibt es Lösungen, bei denen nur eine Datenbankabfrage durchgeführt wird?

Antworten:

0 für die Antwort № 1

Ich kann diese Frage immer noch nicht vollständig verstehen. Aber mit 2 Modellen, die mit .OneToOneField verknüpft sind, können Sie dies wie folgt tun:

pos = Position3.objects.all()
# Got all the pos (you can do filter or something else
# then with the object pos, you can get the parent_order like:
order = pos.parent_order # Or for p in pos: or = p.parent_order
# And FK make one to many relationship, OneToOne ~> same way

0 für die Antwort № 2

Sie machen nichts falsch. Das Ticker-Feld befindet sich im entsprechenden InternalOrder-Feld. Sie können über darauf zugreifen new[0].parent_order.ticker.