Django:在模型创建时创建一对一实例

时间:2018-07-30 14:36:33

标签: django django-models

所以我知道我可以使用信号自动创建一对一的相关实例。 (例如: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,这是否就消除了对信号的需要?

1 个答案:

答案 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)