From a9008f89283d62f9c424e8d7a0f4bb589c2a7963 Mon Sep 17 00:00:00 2001 From: Malcolm Tredinnick Date: Thu, 28 Feb 2008 13:21:33 +0000 Subject: [PATCH] queryset-refactor: Added caching for reverse-one-to-one lookups. This is the only type of reverse lookup where caching makes sense might make some kinds of model inheritance interactions more database friendly. git-svn-id: http://code.djangoproject.com/svn/django/branches/queryset-refactor@7171 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/models/fields/related.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index f6594d617a..20b35cc3d8 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -125,14 +125,19 @@ class SingleRelatedObjectDescriptor(object): # SingleRelatedObjectDescriptor instance. def __init__(self, related): self.related = related + self.cache_name = '_%s_cache' % related.field.name def __get__(self, instance, instance_type=None): if instance is None: raise AttributeError, "%s must be accessed via instance" % self.related.opts.object_name - params = {'%s__pk' % self.related.field.name: instance._get_pk_val()} - rel_obj = self.related.model._default_manager.get(**params) - return rel_obj + try: + return getattr(instance, self.cache_name) + except AttributeError: + params = {'%s__pk' % self.related.field.name: instance._get_pk_val()} + rel_obj = self.related.model._default_manager.get(**params) + setattr(instance, self.cache_name, rel_obj) + return rel_obj def __set__(self, instance, value): if instance is None: