【问题标题】:Django: Create One-to-One instance on model creationDjango:在模型创建时创建一对一实例
【发布时间】:2019-01-06 20:24:27
【问题描述】:

所以我知道我可以使用信号来自动创建一对一相关的实例。 (例如: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 传递给接收器?我需要在User 模型中创建自定义管理器吗?如果是这样,由于我可以在管理器中创建UserProfile,这是否会消除对信号的需求?

【问题讨论】:

  • 是的,如果您需要始终在创建时设置公司,则不要使用信号。在任何情况下,您都应该考虑使用扩展的用户模型而不是单独的用户配置文件。
  • 为什么扩展User模型更好?
  • 因为这样您就根本不需要管理两个单独的模型,而且这些甚至都没有发挥作用。您可以使用与创建其余数据相同的方法添加公司。

标签: django django-models


【解决方案1】:

我会推荐使用你自己的 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 2023-02-11
    • 2021-06-19
    • 2017-11-11
    • 2023-02-08
    • 2011-08-02
    • 2021-03-09
    相关资源
    最近更新 更多