简体   繁体   中英

Django: use a Foreignkey relationship for custom user model

I am writing a webapp where I want to have a general Person table to uniquely identify any person interacting with the website, eg to be able to comply to GDPR requests.

Some Person s will should also be User s in the authentication sense. I'd like to use Person.email for the username.

However, I cannot manage to make authentication / admin interface work.

Simplified models:

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?

I found a very old Django issue that seems related: https://code.djangoproject.com/ticket/21832

Any idea, how to make this work with a foreign key to hold the basic user information?

from django.db import models from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin

Here you go for correct way of achieving this

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)

Note: If you use AbstractBaseUser models, then you have to write custom model manager.

To avoid writing custom models manager, you should use AbstractUser

class User(AbstractUser):
      pass
      # here all the required fields like email, name etc item

You can create Person record for the user when a user records creating using django signal:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM