2011-06-21 18 views
4

Djangoのやり方は少し新しくなっていますが、より効率的に行うことができる一連のループがあります。基本的に私は関連するオブジェクトのグループを持っており、グラフをドリルダウンしてエンド関連のオブジェクトから値を取得する必要があります。私は最終的に私が望む値を得るためにオブジェクトをループしています。以下のコードを参照してください:効率的なDjangoクエリ

  for media in campaign.media_set.all(): 
       media_key = media.key 
       for target in media.target_set.all(): 
        x = target.x 
        y = target.y 
        target_id = target.id 
        for metatag in target.metatag_set.all(): 
         body = metatag.body 
         hdr = metatag.header 
         ftr = metatag.footer 
         ct_url = metatag.clickthrough 
         point_url = metatag.point.image_file 

少ないDBでこれを行うにはどのような方法がありますか?あなたの最初の検索が大幅に役立つかもしれない前にhttps://docs.djangoproject.com/en/dev/topics/db/optimization/

はおそらくちょうどselect_relatedを追加:この一般的に

答えて

4

はい、あなたはそれを後ろ向きにしています。これは私がDjangoと作業するときに何度もあった問題です。 は、すべての条件を満たすために取得して後方に作業したいオブジェクトでもっとも簡単です。つまり、このmetatagについての情報が必要なように見えるので、それから始めてください。

MetaTag.objects.filter(conditions_here) 

そしてちょうどMetaTagオブジェクト上に作成された自動related_nameプロパティを使用して、この目標X/Yのような他のものを取得します。あなたのモデルを見ることなく、正確に言うのは難しいです。

+1

パーフェクト。アドバイスをいただきありがとうございます。これは次のようになった。 MetaTag.objects.filter(target__media__campaign__in = campaigns): – Jiyosub

1

は偉大な読み取りです。

+0

select_relatedはこの場合は何も行いません。彼は自分のループで外向に従っていますselect_relatedあなたがそれらをフォローしているなら助けてください – John

0

これは、モデル定義を見ることなしにはほとんど答えることができません。これらがForiegnKey関係よりも外ループを完全に排除し、外部キーに従うことですべてのデータを生成することができます(もちろんselect_relatedを使用してすべてのデータを同時に取得できます)

しかし、多くの人との関係を見て、外国の鍵をバックアップするだけでいいわけではありません。