所以我知道我可以使用信号自动创建一对一的相关实例。 (例如:Create OneToOne instance on model creation)。
我的情况是相关模型包含一个非空,非空白字段。
class Company(models.Model):
name = models.CharField()
class UserProfile(models.Model):
user = models.OneToOneField( settings.AUTH_USER_MODEL )
company = models.ForeignKey( Company )
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_user_profile( sender, instance, created, **kwargs ):
if created:
UserProfile.objects.create(user=instance)
创建用户后,将触发create_user_profile
。但这会导致错误Column company_id cannot be null
。如何将company_id传递给接收者?我需要在用户模型中创建自定义管理器吗?如果是这样,因为我可以在管理器中创建UserProfile
,这是否就消除了对信号的需要?
答案 0 :(得分:0)
我建议您使用自己的User模型,然后可以向其添加很多很酷的类方法,例如create和delete,这对于以后的数据完整性很有用,例如防止delete()中的删除,在create()等中强制执行OneToOne。在这种情况下,我假设您在创建用户时就知道公司:
class User(models.model):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True)
@classmethod
def create(cls, email, company):
new_user = cls(email=email)
new_user.save()
new_profile = UserProfile(user=new_user, company=company)
new_profile.save()
return new_user
class Company(models.Model):
name = models.CharField()
class UserProfile(models.Model):
user = models.OneToOneField( User )
company = models.ForeignKey( Company )
然后,您可以使用以下命令创建用户:
my_user = User.create(email=new_email, company=my_company)