modellizzazione dei join esterni in django
-
06-07-2019 - |
Domanda
Ho una tabella di relazione da molte a molte con alcuni dati nella base di giunzione
una versione base del mio modello assomiglia a:
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)
Sto cercando di cercare tutti i valori per una determinata riga con un valore null se il valore non è presente (in pratica sto cercando di visualizzare la tabella fooval con valori null per i valori che non sono stati riempiti) un sql tipico sarebbe
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;
Esiste un modo per modellare la query sopra usando il modello django
Grazie
Soluzione
I join esterni possono essere visualizzati come un hack perché SQL manca di "navigazione".
Quello che hai è una semplice situazione if-statement.
for line in someRangeOfLines:
for col in someRangeOfCols:
try:
cell= FooVal.objects().get( col = col, line = line )
except FooVal.DoesNotExist:
cell= None
Questo è davvero un join esterno: una tentata ricerca con una sostituzione NULL.
L'unica ottimizzazione è simile alla seguente.
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)