2

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

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

当我搜索如何更改id用户表时,UUID我得到了许多扩展的教程AbstractBaseUser

这是我写了自己的User模型。

帐户/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插件来启用使用社交网络登录并仅使用电子邮件进行身份验证。我是否需要email在扩展模型中添加字段unique=True

4

2 回答 2

2

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

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

于 2018-01-02T17:16:58.290 回答
0

正如 Django 文档所指出的,事后很难扩展 User 表,并且根本不建议将其用于应用程序。更好的方法是创建一个与 user-id 具有 1:1 关系的辅助表。不理会 Django 的用户表,只需使用另一个表即可。

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

于 2018-01-16T16:00:43.973 回答