modélisation de jointure externe au Django
-
06-07-2019 - |
Question
J'ai plusieurs tables de relations avec des données dans la base de jonction
une version de base de mon modèle ressemble à ceci:
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)
J'essaie de rechercher toutes les valeurs d'une certaine ligne avec une valeur nulle si la valeur n'est pas présente (j'essaie en principe d'afficher la table fooval avec des valeurs nulles pour les valeurs non renseignées) un sql typique serait
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;
Existe-t-il un moyen de modéliser la requête ci-dessus à l'aide du modèle django
Merci
La solution
Les jointures externes peuvent être considérées comme un hack, car SQL manque de "navigation".
Ce que vous avez est une situation if-statement simple.
for line in someRangeOfLines:
for col in someRangeOfCols:
try:
cell= FooVal.objects().get( col = col, line = line )
except FooVal.DoesNotExist:
cell= None
C’est vraiment ce qu’est une jointure externe: une tentative de recherche avec remplacement NULL.
La seule optimisation ressemble à ce qui suit.
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)