【问题标题】:Django: use a Foreignkey relationship for custom user modelDjango:为自定义用户模型使用外键关系
【发布时间】:2021-10-17 22:58:23
【问题描述】:

我正在编写一个 web 应用程序,我希望有一个通用的 Person 表来唯一标识与网站交互的任何人,例如能够遵守 GDPR 要求。

某些Persons 在身份验证意义上也应该是Users。 我想使用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

任何想法,如何使用外键来保存基本用户信息?

【问题讨论】:

    标签: python django django-models django-authentication


    【解决方案1】:

    从 django.db 导入模型 from 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记录:

    https://docs.djangoproject.com/en/3.2/topics/signals/

    【讨论】:

    • 不是每个人都必须拥有一个用户,对吧?并且电子邮件字段在PersonEmail 处重复。这不是我想要达到的目标。
    • 我已经更新了答案。使用 django signal 填充 User 表后,立即填充 Person 字段
    猜你喜欢
    • 2010-10-28
    • 2020-04-20
    • 2014-05-15
    • 2010-10-23
    • 2011-06-12
    • 2015-10-11
    • 2021-09-11
    • 2020-10-21
    • 2017-03-12
    相关资源
    最近更新 更多