Source code for django_utils.fields
import functools
[docs]class RecursiveField(object):
PREFIX = 'get_'
def __init__(self, field_name=None, parent_field='parent', default=None):
self.field_name = field_name
self.parent_field = parent_field
self.default = default
[docs] def contribute_to_class(self, cls, name):
if not self.field_name:
assert name.startswith(self.PREFIX)
self.field_name = name.replace(self.PREFIX, '', 1)
setattr(cls, name, self)
[docs] def get(self, instance):
name = self.field_name
assert name
value = None
while instance and not value:
value = getattr(instance, name, None)
instance = getattr(instance, self.parent_field, None)
if value is None:
value = self.default
return value
def __get__(self, instance, owner):
return functools.partial(self.get, instance)