【问题标题】:How to manage multiple account(user) types in django如何在 django 中管理多个帐户(用户)类型
【发布时间】:2016-09-05 00:01:16
【问题描述】:

我必须在我的应用程序中管理多种用户类型,

  1. Person - 可以是演员、舞蹈家、歌手、导演、演员导演、编舞、音乐总监等
  2. 公司 - 可以是制作公司、音乐公司等

我创建了具有这两个模型的公共字段的用户模型。

class User(AbstractBaseUser):
    #common fields

class PersonType(models.Model):
    # persone_type which is a choice field

class Person(User):
    # many to many with PersonType

class CompanyType(models.Model):
    # company_type which is a choice field

class Company(User):
    # many to many with CompanyType

这种方式正确吗?

我如何管理这两种用户的注册和登录。

即在注册时,我应该根据 api 数据中发送的“account_type”字段创建用户对象还是个人/公司对象。

如果是以后的选项,我如何管理两个模型的身份验证和登录?

【问题讨论】:

  • 这在某种程度上是基于意见的,因为这不是对与错的问题。这是一个受许多因素影响的设计问题。不过,就我个人而言,我不会与用户模型混淆,我可能会使用与任意数量的“用户配置文件”模型的用户模型的一对一关系。
  • 好吧,我没有得到关于“用户资料”的最后一部分......所以你的意思是对于每个用户类型,如演员、导演、舞者,会有不同的模型,而 AUTH_USER_MODE 将是用户,对吗?跨度>
  • 这是主要思想。然后,您可以基于用户配置文件模型拥有单独的多个模型,或者拥有一个具有某些分类字段的单个模型,有很多可能性。正如我所说,这最终取决于许多因素。
  • 在开始之前,请确保您了解 AbstractBaseUser 和 AbstractUser 之间的区别。一旦您在项目中走得更远,您的用户模型就更难更改,我发现如果可能的话,最好坚持使用 AbstractUser。
  • 嗨,是的,我看到了区别,但 AbstractUser 将用户名作为唯一键,而在我的要求中,用户名不存在(而只有 first_name,last_name 存在)所以我使用了最少的 AbstractBaseUser。

标签: django python-3.x database-design django-models database-schema


【解决方案1】:

如果可能的话,我喜欢保持简单。

user_type_choices = (('p', 'person'), ('c', 'company'))

class MyUser(AbstractBaseUser):
    ...
    user_type = models.CharField(max_length=1, choices=user_type_choices)
    user_group = models.ManyToManyField(UserGroup)

这为以后更多的 user_types 留下了空间。然后使用 Django 的组或您自己的带有“组”定义的表。

class UserGroup(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField()
    allowed_user_type = models.CharField(max_length=1, choices=user_type_choices)

为确保没有人被添加到不允许他们加入的组中,只需覆盖 save() 并检查该组是否允许 user_type

【讨论】:

  • 这看起来不错!!但只有一个人怀疑我的 Person 和 Company 模型具有彼此不同的字段。这就是为什么我为他们创建了两个单独的模型。我应该把它们放在“MyUser”中吗??
  • 啊,好吧,那么将MyUser 子类化为两个单独的模型可能是有意义的。或者,检查是否有一种方法可以组合某些字段以使它们适合两种类型。我可能会尝试坚持使用一个 MyUser 模型。
  • 好的,我试过了,但我无法将两者结合起来,因为 Person 是活的,而 Company 是非活的实体,所以有些字段不同,我无法结合。
猜你喜欢
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2016-05-11
  • 1970-01-01
  • 2018-02-14
  • 2019-04-10
相关资源
最近更新 更多