äußere Verknüpfung Modellbau in django
-
06-07-2019 - |
Frage
Ich habe eine viel zu viel Beziehungstabelle whith einige Daten in der Verbindungsbasis
eine Basisversion meines Modells wie folgt aussehen:
class FooLine(models.Model):
name = models.CharField(max_length=255)
class FooCol(models.Model):
name = models.CharField(max_length=255)
class FooVal(models.Model):
value = models.CharField(max_length=255)
line = models.ForeignKey(FooLine)
col = models.ForeignKey(FooCol)
Ich versuche, alle Werte für eine bestimmte Zeile mit einem Null zu suchen, wenn der Wert nicht vorhanden ist (im Grunde versuche ich, die fooval Tabelle mit Nullwerten für Werte angezeigt werden, die nicht gefüllt) eine typische SQL wäre
SELECT value FROM FooCol LEFT OUTER JOIN
(FooVal JOIN FooLine
ON FooVal.line_id == FooLine.id AND FooLine.name = "FIXME")
ON FooCol.id = col_id;
Gibt es eine Möglichkeit über Abfrage mit django Modell modelise
Danke
Lösung
Outer-Joins kann als Hack angesehen werden, da SQL fehlt "Navigation".
Was Sie haben, ist eine einfache if-Anweisung Situation.
for line in someRangeOfLines:
for col in someRangeOfCols:
try:
cell= FooVal.objects().get( col = col, line = line )
except FooVal.DoesNotExist:
cell= None
Das ist, was eine äußere Verknüpfung wirklich ist -. Ein versuchter Lookup mit einem NULL-Ersatz
Die einzige Optimierung ist so etwas wie die folgenden.
matrix = {}
for f in FooVal.objects().all():
matrix[(f.line,f.col)] = f
for line in someRangeOfLines:
for col in someRangeOfCols:
cell= matrix.get((line,col),None)