0

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

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

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

两个问题:

  1. 选择此表的最 Django 风格的方式是什么?

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

4

1 回答 1

0

对于第一个问题,我找到的解决方案是抓取直通表,然后使用它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 个对象的表中,我实际上也能够做到这一点并将其全部存储在内存中,而不会让服务器过于崩溃。

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

于 2015-08-03T21:11:05.703 回答