mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-04-13 09:42:01 +00:00
30 lines
No EOL
1.2 KiB
Python
30 lines
No EOL
1.2 KiB
Python
from django.db.models import OneToOneField
|
|
from django.db.models.fields.related import SingleRelatedObjectDescriptor
|
|
|
|
from south.modelsinspector import add_introspection_rules
|
|
add_introspection_rules([], ["^utils\.fields\.AutoOneToOneField"])
|
|
|
|
class AutoSingleRelatedObjectDescriptor(SingleRelatedObjectDescriptor):
|
|
def __get__(self, instance, instance_type=None):
|
|
try:
|
|
return super(AutoSingleRelatedObjectDescriptor, self).__get__(instance, instance_type)
|
|
except self.related.model.DoesNotExist:
|
|
obj = self.related.model(**{self.related.field.name: instance})
|
|
obj.save()
|
|
return obj
|
|
|
|
|
|
class AutoOneToOneField(OneToOneField):
|
|
'''
|
|
OneToOneField creates related object on first call if it doesnt exist yet.
|
|
Use it instead of original OneToOne field.
|
|
|
|
example:
|
|
|
|
class MyProfile(models.Model):
|
|
user = AutoOneToOneField(User, primary_key=True)
|
|
home_page = models.URLField(max_length=255, blank=True)
|
|
icq = models.IntegerField(max_length=255, null=True)
|
|
'''
|
|
def contribute_to_related_class(self, cls, related):
|
|
setattr(cls, related.get_accessor_name(), AutoSingleRelatedObjectDescriptor(related)) |