summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-02-28 13:21:33 +0000
committerMalcolm Tredinnick <malcolm.tredinnick@gmail.com>2008-02-28 13:21:33 +0000
commita9008f89283d62f9c424e8d7a0f4bb589c2a7963 (patch)
tree9d6dedd345c34ed22fe66d71d7ce351cd5876f90
parent33a0862215edeaa7848e625cd0b0777fb4885de1 (diff)
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
-rw-r--r--django/db/models/fields/related.py11
1 files 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: