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

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top