2009-07-30 5 views
0

J'ai plusieurs à plusieurs table de relation de cinque certaines données dans la base de jointoiementjointure externe modelisation dans django

une version de base de regarder mon modèle comme:

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) 

Je suis en train de chercher tous les valeurs pour une certaine ligne avec une valeur nULL si la valeur n'est pas présent (en gros je suis en train d'afficher la table fooval avec des valeurs nulles pour les valeurs qui ne sont pas remplies) 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; 

Est-il possible de modéliser ci-dessus requête en utilisant le modèle de django

Merci

Répondre

0

jointures externes peut être considérée comme un hack parce que SQL n'a pas « navigation ».

Ce que vous avez est une simple situation if-statement.

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

C'est ce qu'une jointure externe est vraiment - une tentative de recherche avec un remplacement NULL.

La seule optimisation est quelque chose comme ceci.

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) 
Questions connexes