diff options
| author | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-02-28 13:21:33 +0000 |
|---|---|---|
| committer | Malcolm Tredinnick <malcolm.tredinnick@gmail.com> | 2008-02-28 13:21:33 +0000 |
| commit | a9008f89283d62f9c424e8d7a0f4bb589c2a7963 (patch) | |
| tree | 9d6dedd345c34ed22fe66d71d7ce351cd5876f90 | |
| parent | 33a0862215edeaa7848e625cd0b0777fb4885de1 (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.py | 11 |
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: |
