2011-01-27 10 views
3

私はselect_related()クエリーセットを実行してヒットデータベースを無意識に使用しないようにしています。私の見解では約select_related()キャッシング

class Item(models.Model) 
    user = models.ForeignKey(User, related_name='items') 
    name = models.CharField(max_length=255) 
    region = models.ForeignKey(Region, null = True, blank = True) #django-cities 
    country = models.ForeignKey(Country, null = True, blank = True) #django-cities 

    def get_ubicacion_name(self): 
     if self.region: 
      return self.region 
     else: 
      return self.country 

class Activity(models.Model) 
    date = models.DateField() 
    item = models.ForeignKey(Item, related_name='items') 

:私のテンプレートで

ax = Activity.objects.select_related('item','item__region','item__country').all()[:40] 

を:

{% for a in ax %} 
    {{ a.date }} - {{ a.get_ubicacion_name }} 
{% endfor %} 

デバッグ・ツールバーが表示さ43 queries in 53.87msのでselect_related('item','item_region','item_country')が動作していないself.countryに当たっているので、私は持っている私のモデルでは このdefのために?シェルで

>>> ac = ax[0] 
>>> dir(ac) 
...... '_item_cache', ....... 
>>> dir(ac.item) 
...... '_country_cache','_region_cache',....... 

はあなたに感謝します。

+0

select_related()を使用してみましたか?引数のポイントは、クエリがどのFKに続くかを制限することですが、それに従うだけですので、それは重要ではありません。さらに、select_relatedは可能な限りFKを自動的にフォローするので、FK関係(地域および国)を追うように指示する必要はありません。私はselect_relatedが__ "follow"構文でうまく動作するか確かめていません。 –

+3

@Alex Kuhl:いいえ、OPの構文は正しいです:select_relatedは、地域と国のFKの場合である 'null = True'との関係に自動的に従いません。 –

+0

ああ、あなたが正しいです、私はあなたの定義でn​​ullsを逃した。 –

答えて

0

これは動作するはずです。シェルで試してみることはできますか?あなたがビューでそうであるように、その後、dirで最初のメンバーを調べaxクエリセットを取得します:あなたが見るべき属性の

>>> ac = ax[0] 
>>> dir(ac) 

一つDjangoはForeignKeyの検索をキャッシュする方法である、_item_cacheです。同様に、dir(ac.item)を実行すると、_region_cache_country_cacheのエントリが表示されます。そうでない場合は、ここに結果を投稿してください。うまくいけば、さらにデバッグすることができます。

+0

あなたの推奨デバッグで質問を編集しました。 – panchicore

0

私は問題は都市にも地域や国に関係していることだと思う:

class City(models.Model): 
# snip 
region = models.ForeignKey(Region) 
# snip 

def __unicode__(self): 
    return "%s, %s" % (self.name, self.region) 

、アイテムが少なくとも1を生成し、その後City.__unicode__()メソッドが呼び出されます関連する都市を持っている場合は、get_ubicacion_name()を呼び出すとき各項目の新しい照会(地域を見つけるため)。

次のように私はあなたのselect_relatedを変更したい:

ax = Activity.objects.select_related(
    'item','item__region__city__country','item__country' 
).all()[:40] 

を私はこれをテストしていませんが、私はそれが動作するはずだと思います。

関連する問題