/ / Присъединяване към друга таблица в полета, различни от нейния първичен ключ - mysql, sql, django, django-models

Присъединяване към друга таблица на полета, различни от нейния първичен ключ - mysql, sql, django, django-models

Да предположим, че имам 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 таблици, а не имената на моделите на Джанго.