В Маньяка в блозі добре описаний такий випадок і пропонується AutoOneToOneField().
http://softwaremaniacs.org/blog/2007/03/07/auto-one-to-one-field/Це краще за OneToOneField() тим, що профіль (якщо він ще не створений) при зверненні
створюється автоматично.
Буде виглядати приблизно так:
#——————————————————————————
class AutoSingleRelatedObjectDescriptor(SingleRelatedObjectDescriptor): # this line just can't be too long, right?
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.show_customers = True
obj.show_projects = True
obj.show_tasks = True
obj.tasks_shared = False
obj.share_users = “”
obj.save()
return obj
#——————————————————————————
class AutoOneToOneField(OneToOneField):
‘'’
OneToOneField, которое создает зависимый объект при первом обращении
из родительского, если он еще не создан.
‘'’
def contribute_to_related_class(self, cls, related):
setattr(cls, related.get_accessor_name(), AutoSingleRelatedObjectDescriptor(related))
if not cls._meta.one_to_one_field:
cls._meta.one_to_one_field = self
#——————————————————————————
class Profile(models.Model):
“”“
User's profile
”“”
user = AutoOneToOneField(User, related_name=“profile”, editable=False)
…
…
openid = models.CharField(maxlength=“200”, blank=True)
share_users = models.TextField()
def __str__(self):
return self.user.username
def __unicode__(self):
return self.user.username
class Meta:
verbose_name = “User's profile”
verbose_name_plural = “User's profiles”
class Admin:
pass