Кеширование моделей Django - PullRequest
0 голосов
/ 06 марта 2012

В models.py у меня есть модели Order and Item, Item, содержащие цену и вес:

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 - похожие запросы. Есть ли что-то для кэша в сумме и весе модели заказа.

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Я не уверен, что вы на самом деле спрашиваете, но кверсет в django ленивый . Это означает, что django фактически не выполняет запрос, пока набор запросов не будет оценен .

Это может быть то, что вы видите, когда говорите, что оно кэшировано.

0 голосов
/ 06 марта 2012

С чего вы взяли, что Django выполняет запросы для получения order.price и order.weight?Это не так.Он выполняет один запрос, чтобы получить заказ и связанный с ним элемент (потому что вы использовали select_related).После этого все просто операции с данными, которые у него уже есть.

...