2012-03-06 230 views
0

在models.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 

在views.py我選擇我的訂單:

@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 - 類似的查詢。 Order模型總和和重量中是否有緩存?

+0

有很多簡單的方法來做這種緩存,但沒有理由。所有你要緩存的是整數乘法的結果;因爲您已經訪問模板中的'order.item',所以您不會保存DB往返,並且您仍然使用select_related。 – AdamKG 2012-03-06 16:05:56

回答

0

是什麼讓你覺得Django正在查詢order.price和order.weight?事實並非如此。它正在執行單個查詢,以獲取訂單及其相關項目(因爲您使用了select_related)。之後的一切都只是對已經擁有的數據進行操作。

+0

select_related緩存myorder.item.article,myorder.item.name,但對於myorder.price,myorder.weight django做兩個查詢 – mikhail 2012-03-06 16:13:38

+0

不,它不。這些方法引用已經被緩存的'self.item'。 (我認爲你的意思是'myorder.sum',而不是價格。) – 2012-03-06 16:23:35