Pregunta

Tengo una tabla de relación de muchos a muchos con algunos datos en la base de unión

una versión básica de mi modelo se ve así:

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)

Estoy tratando de buscar en todos los valores una determinada línea con un valor nulo si el valor no está presente (básicamente estoy tratando de mostrar la tabla fooval con valores nulos para los valores que no se han rellenado) un sql típico sería

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;

¿Hay alguna forma de modelar la consulta anterior utilizando el modelo django

Gracias

¿Fue útil?

Solución

Las uniones externas se pueden ver como un truco porque SQL carece de "navegación".

Lo que tiene es una situación simple de declaración de if.

for line in someRangeOfLines:
    for col in someRangeOfCols:
        try:
            cell= FooVal.objects().get( col = col, line = line )
        except FooVal.DoesNotExist:
            cell= None

Eso es lo que realmente es una combinación externa: un intento de búsqueda con un reemplazo NULL.

La única optimización es algo como lo siguiente.

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top