Как выбрать всю промежуточную таблицу в Django

В моей базе данных есть цитаты между объектами как поле ManyToMany. По сути, каждый объект может ссылаться на любой другой объект.

В Postgres это создало промежуточную таблицу. Таблица содержит около 12 миллионов строк, каждая из которых выглядит примерно так:

 id | source_id | target_id 
----+-----------+-----------
 81 |    798429 |    767013
 80 |    798429 |    102557

Два вопроса:

  1. Какой Django-tastic способ выбрать эту таблицу?

  2. Есть ли способ перебрать эту таблицу, не вытягивая все это в память? Я не уверен, что 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 объектами я действительно мог сделать это и поместить все это в память без чрезмерного волнения сервера.

Таким образом, это решило обе мои проблемы, хотя я думаю, что советы в комментариях о курсорах выглядят очень здраво.

Другие вопросы по тегам