【问题标题】:Django models cachingDjango 模型缓存
【发布时间】:2012-03-06 15:58:12
【问题描述】:

在 models.py 我有模型订单和项目,项目包含价格和重量:

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.item,而且您仍然在使用 select_related。

标签: python django django-models


【解决方案1】:

我不确定您实际上在问什么,但quersets in django are lazy。这意味着 django 直到 queryset is evaluated 才真正执行查询。

这可能就是您所说的缓存时所看到的。

【讨论】:

    【解决方案2】:

    是什么让您认为 Django 正在执行查询以获取 order.price 和 order.weight?它不是。它正在执行单个查询,以获取订单及其关联项目(因为您使用了 select_related)。之后的一切都只是对已有数据的操作。

    【讨论】:

    • select_related 缓存 myorder.item.article, myorder.item.name, 但是对于 myorder.price, myorder.weight django 做两个查询
    • 不,它没有。这些方法引用了self.item,它已经被缓存了。 (我猜你的意思是myorder.sum,而不是价格。)
    猜你喜欢
    • 2017-05-14
    • 2010-11-22
    • 2010-12-15
    • 1970-01-01
    • 2013-10-20
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    相关资源
    最近更新 更多