我写了我的第一个申请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
字段?
答案 0 :(得分:2)
Django AbstractBaseUser
仅提供以下字段:password,last_login,is_active。因此,如果您使用从AbstractBaseUser
继承的自定义用户模型,则需要手动定义所有其他字段,例如email
。
另外一个问题是,只需将AUTH_USER_MODEL = 'users.User'
添加到您的settings.py文件中,就可以使所有内容在项目中没有替换代码的情况下运行。
<强> UPD 强>
如果您需要first_name
,last_name
等字段作为模型的包含,则可以使用AbstractUser
代替AbstractBaseUser
。
答案 1 :(得分:0)
正如Django文档所指出的那样,事后很难扩展User表,而且根本不推荐用于应用程序。更好的方法是创建一个与user-id具有1:1关系的辅助表。只留下Django的用户表,只需使用另一个表来实现它。
“Django Annoying”项目,https://github.com/skorokithakis/django-annoying#autoonetoonefield,有一些非常有用的“果汁”可以让这更容易: AutoOneToOneField。而Django的外国人如果记录不存在,-key字段将抛出错误,该字段将自动创建一个即时,从而侧面执行整个问题。 (上面链接的文档页面显示了如何完成此操作。)