моделирование внешнего соединения в Django - PullRequest
0 голосов
/ 31 июля 2009

У меня есть таблица отношений многих ко многим с некоторыми данными в базе соединения

базовая версия моей модели выглядит так:

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)

Я пытаюсь найти каждое значение для определенной строки с нулевым значением, если значение отсутствует (в основном я пытаюсь отобразить таблицу с пустыми значениями для значений, которые не были заполнены) типичный sql будет

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;

Есть ли способ смоделировать вышеуказанный запрос, используя модель django

Спасибо

1 Ответ

0 голосов
/ 31 июля 2009

Внешние объединения можно рассматривать как хак, потому что в SQL отсутствует «навигация».

То, что у вас есть, - простая ситуация с утверждением if.

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

Вот что такое внешнее объединение - попытка поиска с заменой NULL.

Единственная оптимизация - что-то вроде следующего.

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)
...