在Django

时间:2018-01-02 17:03:10

标签: django django-allauth django-users django-2.0

我写了我的第一个申请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字段?

2 个答案:

答案 0 :(得分:2)

Django AbstractBaseUser仅提供以下字段:password,last_login,is_active。因此,如果您使用从AbstractBaseUser继承的自定义用户模型,则需要手动定义所有其他字段,例如email。 另外一个问题是,只需将AUTH_USER_MODEL = 'users.User'添加到您的settings.py文件中,就可以使所有内容在项目中没有替换代码的情况下运行。

<强> UPD 如果您需要first_namelast_name等字段作为模型的包含,则可以使用AbstractUser代替AbstractBaseUser

答案 1 :(得分:0)

正如Django文档所指出的那样,事后很难扩展User表,而且根本不推荐用于应用程序。更好的方法是创建一个与user-id具有1:1关系的辅助表。只留下Django的用户表,只需使用另一个表来实现它。

“Django Annoying”项目,https://github.com/skorokithakis/django-annoying#autoonetoonefield,有一些非常有用的“果汁”可以让这更容易: AutoOneToOneField。而Django的外国人如果记录不存在,-key字段将抛出错误,该字段将自动创建一个即时,从而侧面执行整个问题。 (上面链接的文档页面显示了如何完成此操作。)