自動化無しに生活無し

WEBとかAIとかLinux関係をひたすら書く備忘録系ブログ

【Django】逆参照で効率的にDBにアクセスする【.prefetch_related() 】

thumbnail

例えばこのモデルのとき。

from django.db import models

class Category(models.Model):
    name = models.CharField(verbose_name="名前",max_length=20)
    
class Topic(models.Model):
    comment = models.CharField(verbose_name="コメント",max_length=2000)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

普通に逆参照を使うと、クエリが再実行されるためDBに負担がかかる

categories = Category.objects.all() 

for category in categories 

    # ここでDB読み込み
    print( category.topic_set.all() )

そこで、.prefetch_related() を使って 逆参照するデータを前もってキャッシュしておく。

categories = Category.objects.prefetch_related("topic_set").all() 

for category in categories 
    # キャッシュから読み込みをするので、DBに負担がかからない
    print( category.topic_set.all() )

結論

DBに負担がかかっている場合は、.prefetch_related()を試す。

スポンサーリンク

シェアボタン

Twitter LINEで送る Facebook はてなブログ