大きなテーブルへのForeignKeyにはraw_id_admin=True
下のようなモデルの定義から自動的に生成されます。
class Comment(models.Model): topic = models.ForeignKey("Topic", null=True, blank=True) parent = models.ForeignKey("self", null=True, blank=True) create_date = models.DateTimeField() author = models.ForeignKey(User, null=True) body = models.TextField(blank=True)
すごく楽ちんだったのですが、どう書くorgがにぎわってコメント数が増えてくるに従って どんどん重たくなってきました。
理由はとても簡単で、この自動生成されたリストの部分で、 数千件あるすべてのコメントをデータベースから取ってきて文字列にする処理が行われるからです。
↑数千件がリストの中に…
このせいでページを開くだけで30秒程度かかっていました。 この問題はどうすれば解決できるか。 実はすごく簡単で、フィールドの定義にrw_id_admin=Trueをつけるだけでした。
- parent = models.ForeignKey('self', null=True, blank=True) + parent = models.ForeignKey('self', null=True, blank=True, raw_id_admin=True)このオプションをつけるとすべてを読み込んでリスト表示する代わりに、 下のようなIDを入れる欄と虫眼鏡アイコンが表示されます。
虫眼鏡アイコンを選ぶとアイテムの一覧が別ウィンドウで開きます。
テーブルが大きくなってくるとリスト表示では探すのも面倒になるので、 大きくなりそうなテーブルへForeignKeyを張っているなら今のうちにraw_id_adminをつけておくのも手かもしれません。