如何在 Django 中 select 整个中间 table

How to select entire intermediate table in Django

在我的数据库中,我将对象之间的引用作为 ManyToMany 字段。基本上,每个对象都可以引用任何其他对象。

在 Postgres 中,这创建了一个中间体 table。 table 大约有 1200 万行,每行大致如下:

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

两个问题:

  1. select 这个 table 最 Django 的方式是什么?

  2. 有没有办法在不将整个内容拉入内存的情况下迭代此 table?如果我做一个简单的 select * from TABLE_FOO.

  3. ,我不确定 Postgres 或我的服务器是否会满意

我找到的第一个问题的解决方案是通过 table 抓取,然后使用 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;

它 returns 扁平化了 ValueList 对象,这些对象相当小,我可以很容易地使用它们。即使在我的 table 有 12M 对象的情况下,我实际上也能够做到这一点并将其全部放入内存中而服务器不会出现太多问题。

所以这解决了我的两个问题,尽管我认为评论中关于游标的建议看起来很合理。