Django orm - как объединить несколько таблиц

У меня есть куча таблиц в postgresql:

create TABLE run (
    id integer NOT NULL,
    build_id integer NOT NULL,
);

CREATE TABLE test_info (
    suite_id integer NOT NULL,
    run_id integer NOT NULL,
    test_id integer NOT NULL,
    id integer NOT NULL,
    error_text text
);

CREATE TABLE tool_info (
    id integer NOT NULL,
    tool_id integer,
    revision_id integer,
    test_info_id integer,
);

CREATE TABLE suite_info (
    id integer,
    suite_id integer NOT NULL,
    run_id integer NOT NULL,

);
CREATE TABLE test (
    id integer NOT NULL,
    path text NOT NULL
);

Я хочу написать следующий запрос, используя django ORM. Я использую версию 2.2.

select test.path, tool_info.id, run.id, test_info.id, suite_info.id from run join test_info on run.id = test_info.run_id join suite_info on run.id = suite_info.run_id join tool_info on tool_info.test_info_id=test_info.id join test on test_info.test_id=test.id where run.id=34;

Я пробовал следующее:

x= Run.objects.filter(suiteinfo__run_id=34)
(Pdb) str(x.query)
'SELECT "run"."id", "run"."build_id", "run"."date", "run"."type_id", "run"."date_finished", "run"."ko_type", "run"."branch_id", "run"."arch_id" FROM "run" INNER JOIN "suite_info" ON ("run"."id" = "suite_info"."run_id") WHERE "suite_info"."run_id" = 34'

Я вижу, что он выполняет join, но данные не появляются в select. Я пробовал selected_related и т. п.

Таблица RUN - это центральная таблица, которая связывает данные воедино. Как создать такой запрос с помощью ORM?

Для объединения таблиц с помощью ORM вы можете использовать select_related() и prefetch_related(). Изучите эти темы, чтобы определить, какая из них подходит именно вам.

Надеюсь, эта информация была для вас полезной.

Вы можете включить его в SELECT часть с .select_related(…) [Django-doc]:

Run.objects.filter(suiteinfo__run_id=34).select_related('suiteinfo__run')
Вернуться на верх