modelación de unión externa en django
-
06-07-2019 - |
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
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)