0

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

我有两种类型不同的用户——公司和客户,所以我决定创建两种类型的UserProfiles. CompanyProfileCustomerProfile。每个用户都有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字段,但它看起来不是最好的方法。

4

1 回答 1

0

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

所以:只需指向User使用两个模型中的ForeignKey或,不要向.OneToOneFieldProfileUser

为了使代码更简单,您可以添加一个UserManager以使您的查询更具可读性:

class UserManager(DefaultUserManager):

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

这样您就可以执行查询,例如contract.parties.companies()(假设 a有contract多个对象的查询集。partiesUser

UserManager您还需要子类化以AbstractUser覆盖默认objects设置。

于 2018-01-24T14:55:16.843 回答