在我的数据库中,我在对象之间引用了ManyToMany字段。基本上,每个对象都可以引用任何其他对象。
在Postgres中,这创建了一个中间表。该表有大约1,200万行,每个行看起来大致如下:
id | source_id | target_id
----+-----------+-----------
81 | 798429 | 767013
80 | 798429 | 102557
两个问题:
选择这张桌子的Django-tastic方法是什么?
有没有办法迭代这个表而不将整个内容拉入内存?如果我做一个简单的select * from TABLE_FOO
,我不确定Postgres或我的服务器会很高兴。
答案 0 :(得分: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对象的表中,我实际上也可以将其全部放入内存中,而不会让服务器过于苛刻。
所以这解决了我的问题,虽然我认为关于游标的评论中的建议看起来非常合理。