Django Queryset : Левое внешнее соединение нескольких таблиц, группировка по разным столбцам, имеющим одинаковое значение?
У меня есть следующая модель структуры :
Model A :
id
misc
id misc
1 something
2 randomstuff
Model B :
id : Foreign Key A.id
date
amount
id date amount
1 2021-11-15 10
1 2021-11-16 15
2 2021-11-16 20
Model C :
id : Foreign Key A.id
date
amount
id date amount
1 2021-11-15 1
2 2021-11-16 2
2 2021-11-16 3
Я хочу сделать набор запросов, где я могу Left join три таблицы, где B и C имеют столбец "дата", которые, относительно, не связаны, но на практике являются точно такими же столбцами.
Итак, я хочу сделать агрегированную таблицу, и мой желаемый результат :
id date A.amount B.amount
1 2021-11-15 10 1
1 2021-11-16 15 0
2 2021-11-15 20 2
2 2021-11-16 0 3
что в основном означает объединение A и B/C, а также B и C по дате (и id).
Попытки обычного соединения, очевидно, дали мне 6+ строк (поскольку B.date и C.date - это совершенно разные столбцы, и они просто соединяются для каждой комбинации), поэтому я искал способ соединить два отношения с несколькими "ON"
Я попробовал FilteredRelation, как показано ниже :
res = (qs
.annotate(BB=FilteredRelation('B, ))
.annotate(CC=FilteredRelation('C',condition=Q(C__date=F('B__date')) ))
.values("id","BB__amount","CC__amount")
)
print (res.query)
SELECT A."id", B."amount",C."amount"
FROM "stores_store"
LEFT OUTER JOIN "B" BB
ON (A."id" = B."id")
LEFT OUTER JOIN "C" CC
ON (A."id" = C."id" AND (C."date" = T4."date"))
что приводит к ошибке, связанной с произвольной таблицей T4 (которая появилась из ниоткуда, предполагаемое IMO = B. "date") при фактическом выполнении.
Я думаю, когда T4 вместо цели B.date, это должно работать, но queryset сгенерировал T4 вместо этого.
Я также попробовал Window (partition by [B.date]), но это также дает мне ту же проблему, что и обычные соединения (B.date, C.date генерируют комбинации вместо объединения/соединения).
Есть ли способ достичь этого / или я что-то упустил?
Просто в качестве примечания, я хотел бы предпочесть решение, которое не использует OuterRef + Subquery/raw SQL, и не изменяет саму модель, если это возможно. дайте мне знать, если это единственный способ, пожалуйста, хотя.