Вопрос

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

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

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)

Я пытаюсь выполнить поиск по каждому значению для определенной строки с нулем, если значение отсутствует (в основном я пытаюсь отобразить таблицу fooval с нулевыми значениями для значений, которые не были заполнены) типичный 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

Спасибо

Это было полезно?

Решение

Внешние соединения можно рассматривать как взлом, поскольку в 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top