Как выбрать всю промежуточную таблицу в Django
В моей базе данных есть цитаты между объектами как поле ManyToMany. По сути, каждый объект может ссылаться на любой другой объект.
В Postgres это создало промежуточную таблицу. Таблица содержит около 12 миллионов строк, каждая из которых выглядит примерно так:
id | source_id | target_id
----+-----------+-----------
81 | 798429 | 767013
80 | 798429 | 102557
Два вопроса:
Какой Django-tastic способ выбрать эту таблицу?
Есть ли способ перебрать эту таблицу, не вытягивая все это в память? Я не уверен, что Postgres или мой сервер будут рады, если я сделаю простой
select * from TABLE_FOO
,
1 ответ
Решение, которое я нашел для первого вопроса, состояло в том, чтобы взять сквозную таблицу и затем использовать values_list
чтобы получить плоский результат.
Итак, из моего примера это становится:
through_table = AcademicPaper.papers_cited.through
all_citations = through_table.objects.values('source_id', 'target_id')
Выполнение этого запускает самый простой SQL, который я ожидал:
print all_citations.query
SELECT 'source_id', 'target_id' FROM my_through_table;
И он возвращает уплощенные объекты ValueList, которые довольно малы, и я могу работать с ними очень легко. Даже в моей таблице с 12M объектами я действительно мог сделать это и поместить все это в память без чрезмерного волнения сервера.
Таким образом, это решило обе мои проблемы, хотя я думаю, что советы в комментариях о курсорах выглядят очень здраво.