datatracker/ietf/utils/cache_foreign_key.py
Henrik Levkowetz cd030d3b43 Adding copyright notices to all python files
- Legacy-Id: 716
2007-06-27 21:16:34 +00:00

48 lines
1.5 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]
def __set__(self, instance, value):
if self.reverse:
# this is dangerous
#other_instance = self.__get_attr(instance).all()[0]
#setattr(other_instance, self.field, value)
#other_instance.save()
raise NotImplemented
else:
setattr(instance, self.field, value)