【问题标题】:DJANGO - Add field to default auth.User model - simplest wayDJANGO - 将字段添加到默认 auth.User 模型 - 最简单的方法
【发布时间】:2018-01-24 14:43:02
【问题描述】:

寻找一种将一个字段添加到 Django's User 模型的最简单方法。

我有两种类型不同的用户——公司和客户,所以我决定创建两种类型的UserProfilesCompanyProfileCustomerProfile。每个用户都有CompanyProfileCustomerProfile

为了能够filter 并决定它是哪种类型,我想将type 字段添加到User 模型中。

你有什么建议?现在我在中间有UserProfile,这似乎有点矫枉过正,它使过滤、查找和许多其他事情变得不那么简单。

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='userprofile')
    type = models.CharField(max_length=100, choices=settings.OBSTARAJME_USERPROFILE_TYPE_CHOICES)
    company_profile = models.OneToOneField('CompanyProfile', null=True, blank=True, on_delete=models.CASCADE,
                                           related_name='userprofile')
    customer_profile = models.OneToOneField('CustomerProfile', null=True, blank=True, on_delete=models.CASCADE,
                                            related_name='userprofile')

我正在考虑创建我的自定义User 模型。

class User(AbstractBaseUser):
    type = models.CharField(max_length=100, choices=settings.OBSTARAJME_USER_TYPE_CHOICES)
    USERNAME_FIELD = 'username'

但是Django 说没有像username 这样的字段,我想避免手动编写整个User 模型及其所有字段。

编辑 我知道我可以根据customerprofile__isnull=False 进行过滤,所以实际上我根本不需要type 字段,但它看起来并不是最好的方法。

【问题讨论】:

  • 你应该继承AbstractUser,而不是AbstractBaseUser。后者只有两个字段:password和last_login,而前者本质上是默认的User,只是抽象的。

标签: python django django-users django-2.0


【解决方案1】:

您的最后一次编辑实际上给出了最简单的解决方案:不要添加type 和中间模型。如果User 在某个阶段变成CompanyCustomer 会怎样(即使这不是您现在所期望的,但业务需求会发生变化......)? type 是不可能的。

所以:只需使用两个Profile 模型中的ForeignKeyOneToOneField 指向User,不要向User 添加任何内容。

您可以通过添加UserManager 来使您的代码更简单,以使您的查询更具可读性:

class UserManager(DefaultUserManager):

    def companies(self):
        return self.get_queryset().filter(customerprofile__isnull=False)

这样您就可以执行诸如contract.parties.companies() 之类的查询(假设contract 有多个parties,它们是User 对象的查询集。

使用UserManager,您还需要继承AbstractUser 以覆盖默认的objects 设置。

【讨论】:

    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 2011-06-11
    • 2023-03-09
    • 2015-06-29
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    相关资源
    最近更新 更多