Skip to content

Instantly share code, notes, and snippets.

@vstoykov
Created March 22, 2012 16:04
Show Gist options
  • Save vstoykov/2159224 to your computer and use it in GitHub Desktop.
Save vstoykov/2159224 to your computer and use it in GitHub Desktop.
One To One field that does not rise an Exception
"""
One To One field that does not rise an Exception
In your models you now can write:
class Profile(models.Model):
user = AdvancedOneToOneField(User, related_name="profile")
And using in code like this:
>>> test = User.objects.create(username="test")
>>> test.profile
<Profile object>
No more exceptions when using OneToOneField
"""
from django.db.models.fields.related import OneToOneField, SingleRelatedObjectDescriptor
class AdvancedSingleRelatedObjectDescriptor(SingleRelatedObjectDescriptor):
"""
This Reated object descriptor returns empty object of related model
if it does not exists, instead of rising an exception
"""
def __get__(self, instance, instance_type=None):
try:
return super(AdvancedSingleRelatedObjectDescriptor, self).__get__(instance, instance_type)
except self.related.model.DoesNotExist:
kwargs = {self.related.field.name: instance}
return self.related.model(**kwargs)
class AdvancedOneToOneField(OneToOneField):
def contribute_to_related_class(self, cls, related):
setattr(cls, related.get_accessor_name(),
AdvancedSingleRelatedObjectDescriptor(related))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment