Да предположим, че имам Table_A
и искам да се присъединя към него Table_B
на две области, които и двете имат, school_id
, и type_id
, В SQL това изглежда така:
SELECT whatever
FROM Table_A
INNER JOIN Table_B
ON (Table_A.school_id = Table_B.school_id
AND Table_A.type_id = Table_B.type_id)
Доколкото разбирам, Django прави присъединяването си чрез Чужди / Първични ключове, определени в моделите. Така че, ако трябваше да направите това A.objects.filter(B__field2="stuff")
тя имплицитно ще се присъедини A.B_id = B.id
в допълнение към пускането на Table_B.field2=stuff
в WHERE
клауза. Има ли начин да се присъедините към ключовете по свой избор, както и в горната SQL заявка?
Отговори:
0 за отговор № 1Ако все още е валидно да изразите заявката си в тази форма:
SELECT whatever FROM Table_A, Table_B WHERE (Table_A.school_id = Table_B.school_id
AND Table_A.type_id = Table_B.type_id)
(което би било еквивалентно на вашия пример по-горе ...) тогава е възможно да направите това чрез Django ORM и екстра клауза, например:
TableA.objects.extra(
tables=["myapp_tableb",],
where=["myapp_tablea.school_id=myapp_tableb.school_id",
"myapp_tablea.type_id=myapp_tableb.type_id"]
)
Осъзнавам, че вероятно има някои видове сложни съединения, които бихте могли да направите в SQL, които няма да се поддават на това.
Грозната част е, че трябва да използвате истинските си имена на SQL таблици, а не имената на моделите на Джанго.