扩展 Django 中的默认用户模型

extending default User model in Django

我写了第一个应用程序Django 2.0

一切正常,当我意识到将 id 主键字段从默认 integer 类型替换为 UUID 以使数据库条目更安全时,应用程序几乎准备就绪。

当我搜索如何将用户 table 的 id 更改为 UUID 时,我得到了很多扩展 AbstractBaseUser.

的教程

这是我自己写的User模型。

account/models.py

class User(AbstractBaseUser):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

但我对不同来源的示例更加困惑。

每个示例都在扩展模型中添加了几个字段,例如

first_name
last_name
is_staff
is_admin
active

并充当

def get_fullname(self):
def get_shortname(self):
etc.

我认为所有这些字段和函数默认都在 AUTH_USER_MODEL 中。

扩展AbstractBaseUser是否会覆盖AUTH_USER_MODEL并且需要添加默认存在的所有字段?

此外,我在不同的模型中使用 settings.AUTH_USER_MODEL 作为外键。 是否应该换成account.User型号?

我还使用 django-allauth 插件来启用使用社交网络登录并仅使用电子邮件进行身份验证。 我是否需要在带有 unique=True 的扩展模型中添加 email 字段?

Django AbstractBaseUser 仅提供以下字段:密码、last_login、is_active。因此,如果您使用从 AbstractBaseUser 继承的自定义用户模型,则需要手动定义所有其他字段,例如 email。 作为问题的另一部分,只需将 AUTH_USER_MODEL = 'users.User' 添加到您的 settings.py 文件中就可以使一切正常,而无需替换项目中的代码。

UPD 如果您需要将 first_namelast_name 等字段包含到模型中,您可以使用 AbstractUser 而不是 AbstractBaseUser.

正如 Django 文档所指出的,事后很难扩展用户 table,并且根本不推荐用于应用程序。更好的方法是创建一个与用户 ID 具有 1:1 关系的辅助 table。别管 Django 的 user-table ,只需使用另一个 table 即可。

位于 https://github.com/skorokithakis/django-annoying#autoonetoonefield"Django Annoying" 项目有一些非常有用的 "juice" 让这变得更容易:一个 AutoOneToOneField. 如果记录不存在,Django 的外键字段将抛出错误,而该字段将自动即时创建一个,从而回避整个问题。 (上面链接的文档页面准确地显示了这是如何完成的。)