48 lines
1.5 KiB
Python
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)
|