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, и не изменяет саму модель, если это возможно. дайте мне знать, если это единственный способ, пожалуйста, хотя.

Вернуться на верх