моделирование внешнего соединения в django
-
06-07-2019 - |
Вопрос
У меня есть таблица отношений "много ко многим" с некоторыми данными в базе соединений
базовая версия моей модели выглядит следующим образом:
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)