datatracker/ietf/utils/cache_foreign_key.py
2010-07-21 12:48:05 +00:00

43 lines
1.4 KiB
Python

# Copyright The IETF Trust 2007, All Rights Reserved
# Caching accessor for the reverse of a ForeignKey relatinoship
# Started by axiak on #django
class FKAsOneToOne(object):
def __init__(self, field, reverse = False, query = None):
self.field = field
self.reverse = reverse
self.query = query
def __get_attr(self, instance):
if self.reverse:
field_name = '%s_set' % self.field
else:
field_name = self.field
return getattr(instance, field_name)
def __get__(self, instance, Model):
if not hasattr(instance, '_field_values'):
instance._field_values = {}
try:
return instance._field_values[self.field]
except KeyError:
pass
if self.reverse:
value_set = self.__get_attr(instance).all()
if self.query:
value_set = value_set.filter(self.query)
try:
instance._field_values[self.field] = value_set[0]
except IndexError:
instance._field_values[self.field] = None
else:
instance._field_values[self.field] = self.__get_attr(instance)
return instance._field_values[self.field]
# We don't try to be smart and define __set__ to adjust the other
# end of the relation since that could require setting several
# fields, failing silently with a naive implementation. Updating
# the other end is the responsibility of the caller.