0

私のデータベースでは、オブジェクト間の引用を ManyToMany フィールドとして持っています。基本的に、すべてのオブジェクトは他のオブジェクトを引用できます。

Postgres では、これにより中間テーブルが作成されました。テーブルには約 1,200 万行あり、それぞれが次のようになります。

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

2 つの質問:

  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 オブジェクトを返します。これはかなり小さく、非常に簡単に操作できます。1,200 万個のオブジェクトを含むテーブルでさえ、実際にこれを実行して、サーバーを過度に混乱させることなく、すべてをメモリに格納することができました。

これで両方の問題が解決しましたが、カーソルに関するコメントのアドバイスは非常に適切に見えます。

于 2015-08-03T21:11:05.703 に答える