diff -r 205804d9f142 -r 91c44b3fd11f src/hdalab/fields.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hdalab/fields.py Fri Nov 14 03:07:20 2014 +0100 @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +''' +Created on Nov 14, 2014 + +from https://gist.github.com/gsakkis/601977 +to correct https://code.djangoproject.com/ticket/10227 + +@author: ymh +''' +from django.db import models +from django.db.models import fields as django_fields +from django.core.exceptions import ObjectDoesNotExist + + +class OneToOneField(models.OneToOneField): + def __init__(self, to, **kwargs): + self.related_default = kwargs.pop('related_default', None) + super(OneToOneField, self).__init__(to, **kwargs) + + def contribute_to_related_class(self, cls, related): + setattr(cls, related.get_accessor_name(), + SingleRelatedObjectDescriptor(related, self.related_default)) + + +class SingleRelatedObjectDescriptor(django_fields.related.SingleRelatedObjectDescriptor): + def __init__(self, related, default): + super(SingleRelatedObjectDescriptor, self).__init__(related) + self.default = default + + def __get__(self, instance, instance_type=None): + try: + return super(SingleRelatedObjectDescriptor, self).__get__(instance, + instance_type) + except ObjectDoesNotExist: + if self.default is None: + raise + value = self.default(instance) + setattr(instance, self.cache_name, value) + if value is not None: + setattr(value, self.related.field.get_cache_name(), instance) + return value \ No newline at end of file