扩展 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_name
、last_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 的外键字段将抛出错误,而该字段将自动即时创建一个,从而回避整个问题。 (上面链接的文档页面准确地显示了这是如何完成的。)
我写了第一个应用程序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_name
、last_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 的外键字段将抛出错误,而该字段将自动即时创建一个,从而回避整个问题。 (上面链接的文档页面准确地显示了这是如何完成的。)