Как избежать необработанного SQL-запроса с несколькими JOIN?
Есть ли способ, как сделать сложные SQL селекты в методах Django? С несколькими JOIN пересекаются несколько таблиц с различными отношениями. Я пробовал много попыток с методом select_related, но так и не разобрался. Проще говоря - мне нужен ListView для модели Objekt отфильтрованный по модели User.
База данных выглядит следующим образом - https://dbdiagram.io/d/61d699903205b45b73d92750/
Я думаю, что подобные запросы должны выполняться гораздо более простым способом.
Набор запросов для ListView
def get_queryset(self):
return Objekt.objects.raw('''SELECT
portal_objekt.id AS id,
portal_objekt.cislo_objektu AS cislo_objektu,
portal_objekt.mesto AS objekt_mesto,
portal_objekt.ulice AS objekt_ulice,
portal_objekt.c_popisne AS objekt_c_popisne,
portal_objekt.c_orientacni AS objekt_c_orientacni,
portal_objekt.psc AS objekt_psc,
CASE
WHEN portal_mereni.komodita = 'e' THEN 'elektřina'
WHEN portal_mereni.komodita = 'p' THEN 'plyn'
WHEN portal_mereni.komodita = 'v' THEN 'voda'
WHEN portal_mereni.komodita = 't' THEN 'teplo'
ELSE 'ostatní'
END AS mereni_komodita
FROM portal_objekt
INNER JOIN portal_sluzbakesmlouve
ON portal_sluzbakesmlouve.objekt_id = portal_objekt.id
INNER JOIN portal_smlouva
ON portal_sluzbakesmlouve.smlouva_id = portal_smlouva.id
INNER JOIN portal_uzivatelkesmlouve
ON portal_uzivatelkesmlouve.smlouva_id = portal_smlouva.id
INNER JOIN portal_user
ON portal_uzivatelkesmlouve.uzivatel_id = portal_user.id
INNER JOIN portal_mereni
ON portal_mereni.objekt_id = portal_objekt.id
WHERE portal_user.email = %s AND
portal_sluzbakesmlouve.platnost_od < CURRENT_DATE AND (
portal_sluzbakesmlouve.platnost_do > CURRENT_DATE OR
portal_sluzbakesmlouve.platnost_do IS NULL )
ORDER BY portal_objekt.cislo_objektu''', [
self.request.user.email
]
)