python - Django:为自定义用户模型使用外键关系
问题描述
我正在编写一个 web 应用程序,我希望有一个通用Person
表来唯一标识与网站交互的任何人,例如能够遵守 GDPR 请求。
有些Person
s will 也应该是User
身份验证意义上的 s。我想Person.email
用于用户名。
但是,我无法使身份验证/管理界面正常工作。
简化模型:
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
class Person(models.Model):
name = models.CharField(max_length=255, blank=False)
email = models.EmailField(blank=False, unique=True)
class User(AbstractBaseUser, PermissionsMixin):
person = models.OneToOneField(Person, on_delete=models.PROTECT)
USERNAME_FIELD = ...# what to put here?
我发现了一个似乎相关的非常古老的 Django 问题: https ://code.djangoproject.com/ticket/21832
任何想法,如何使用外键来保存基本用户信息?
解决方案
从 django.db 导入模型 从 django.contrib.auth.models 导入 AbstractBaseUser, PermissionsMixin
在这里,您可以找到实现这一目标的正确方法
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
USERNAME_FIELD = ['email'] # It's mean you can login with your email
class Person(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
注意:如果您使用AbstractBaseUser
模型,那么您必须编写自定义模型管理器。
为避免编写自定义模型管理器,您应该使用AbstractUser
class User(AbstractUser):
pass
# here all the required fields like email, name etc item
当用户使用 django 信号创建记录时,您可以Person
为用户创建记录:
推荐阅读
- javascript - 尽管数组填充了值,但值未定义
- python-3.x - 在菜单上安装 Anaconda 不够
- mysql - MySQL 排序规则:utf8mb4_unicode_ci 与“utf8mb4 - 默认排序规则”
- rabbitmq - 如何在nodejs中验证rabbitmq?
- scala - org.apache.kafka.common.errors.NetworkException:服务器在收到响应之前断开连接
- python - 使用相应的过去索引值和特定的唯一列值填充新的数据框列
- ballerina - 在芭蕾舞演员中哪里可以找到不同的端点属性
- angular - 如何将不记名令牌应用于 Devextreme dxdata 网格的 odata 源
- php - 不推荐使用 each() 函数。此消息将在进一步调用 PHP 7.2 时被抑制
- esp8266 - 使用ESP8266时路由器中断后无法自动重新连接WiFi