2012-03-06 16 views
0

:views.pyでDjangoのモデルのキャッシング

class Item(models.Model): 
    name = models.CharField(u'Name', max_length=255) 
    article = models.CharField(u'Article', max_length=255) 
    price = models.PositiveIntegerField(u'Price') 
    weight = models.PositiveIntegerField(u'weight', blank=True, null=True, default=None) 

class Order(models.Model): 
    item = models.ForeignKey(Item, verbose_name=u'Item') 
    count = models.PositiveIntegerField(u'Count') 
    user = models.ForeignKey(User, verbose_name=u'User') 

    def sum(self): 
     return self.count*self.item.price 

    def weight(self): 
     return self.count*self.item.weight 

を私は私の注文を選択します。

@render_to('app/purchase_view.html') 
def purchase_view(request): 
     myorders = Order.objects.select_related().filter(user=request.user).all() 

     context.update({ 
      'myorders':myorders, 
     }) 

、テンプレートで:

 {% for myorder in myorders %} 

       <td>{{ myorder.item.article }}</td> 
       <td style="text-align:left;"><a href="#">{{ myorder.item.name }}</a></td> 
       <td>{{ myorder.item.price }}</td> 
       <td>{{ myorder.count }}</td> 
       <td>{{ myorder.sum }}</td> 
       <td>{{ myorder.weight }}</td> 
       </td> 
      </tr> 
     {% endfor %} 

したがって、djangoは各パラメータに対してmyorder.sum、myorder.weight - 類似のクエリを生成します。注文モデルの合計と重量にキャッシュ用のものがありますか?

+0

このキャッシングを行うには多くの簡単な方法がありますが、理由はありません。あなたがキャッシングしているのは、整数の乗算の結果です。テンプレート内の 'order.item'にすでにアクセスしていて、あなたはselect_relatedを使用しているので、DB往復を保存することはありません。 – AdamKG

答えて

1

あなたが実際に尋ねていることはわかりませんが、quersets in django are lazyです。つまり、djangoはqueryset is evaluatedまでクエリを実際に実行しません。

これは、キャッシュされたと言ったときに表示される可能性があります。

0

Djangoはorder.priceとorder.weightを取得するためにクエリを実行していると思いますか?そうではありません。これは、select_relatedを使用したため、注文とその関連アイテムを取得するために単一のクエリを実行しています。その後のすべては、既に持っているデータに対する操作です。

+0

select_relatedキャッシュmyorder.item.article、myorder.item.name、myorder.priceの場合、myorder.weight djangoは2つのクエリを実行します – mikhail

+0

いいえ、それはありません。これらのメソッドは、すでにキャッシュされている 'self.item'を参照しています。 (私はあなたが価格ではなくmyorder.sumを意味すると思います)。 –