mikhail
mikhail

Reputation: 522

Django models caching

In models.py I have models Order and Item, Item containing price and weight:

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

In views.py I select my orders:

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

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

And in template:

        {% 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 %}

so, django generates for each parameter: myorder.sum, myorder.weight - similar queries. Is there something for cache in Order model sum and weight.

Upvotes: 0

Views: 1009

Answers (2)

Daniel Roseman
Daniel Roseman

Reputation: 599470

What makes you think Django is doing queries to get order.price and order.weight? It isn't. It's doing a single query, to get the order and its associated item (because you used select_related). Everything after that is simply operations on data it already has.

Upvotes: 0

Burhan Khalid
Burhan Khalid

Reputation: 174614

I am not sure what you are actually asking, but quersets in django are lazy. This means that django doesn't actually execute the query until the queryset is evaluated.

This might be what you are seeing when you say its cached.

Upvotes: 1

Related Questions