Hi,

I try to reduce the number of db-queries in my app.

There is a model which changes almost never. It is like a "type of ticket"
in a trouble ticket system.

On one page there are seven SQL-Queries (SELECT .... FROM ticket_type where 
id=123) which of course always return
the same result.

I want to cache the objects:

t1=TicketType.objects.get(id=123)
t2=TicketType.objects.get(id=123)

t1 and t2 should be the identical python object, not just objects containing 
the same data.

Has someone done this before?

Here is my first version:

class ThreadLocalQueryset(models.query.QuerySet):
    _threadlocal=threading.local()
    _threadlocal.cache=dict() # The cache is at class-level. It survives a 
request.
    def get(self, **kwargs):
        kwargs_tuple=tuple(kwargs.items())
        obj=self._threadlocal.cache.get(kwargs_tuple)
        if obj is not None:
            return obj
        obj=models.query.QuerySet.get(self, **kwargs)
        self._threadlocal.cache[kwargs_tuple]=obj
        return obj

class ThreadLocalManager(models.Manager):
    use_for_related_fields = True
    def get_query_set(self):
        return ThreadLocalQueryset(self.model, using=self._db)

class TicketType(models.Model):
    objects=ThreadLocalManager()

If there would be many TicketTypes, the interpreter would use more and more 
memory, but there are few.

Feedback welcome,
  Thomas Güttler

-- 
Thomas Guettler, http://www.thomas-guettler.de/
E-Mail: guettli (*) thomas-guettler + de

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to