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

È stato utile?

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top