Django 2.1 - привязка пользователя к связанной модели - PullRequest
1 голос
/ 09 марта 2019

Я создаю проект Django и хочу создать профили двух разных типов пользователей в качестве отдельной модели. У них будет связь OneToOneField с вошедшим в систему пользователем.

class UserMusician(models.Model):
    ...

class UserFan(models.Model):
    ...

Я видел два разных способа сделать это. Один, согласно документам Django 2.1, показывает прохождение в модели User, т.е.

from django.contrib.auth.models import User

class UserMusician(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

В то время как другие примеры, такие как книга Two Scoops of Django , предлагают передать settings.AUTH_USER_MODEL, т. Е .:

from django.conf import settings

class UserMusician(models.Model):
    user = models.OneToOneField(settings.AUTH.USER.MODEL)

Может кто-нибудь сказать мне, в чем различия и каковы преимущества и недостатки любого из них?

Я хотел бы, чтобы эти профили создавались в базе данных при создании учетной записи пользователя, одной или другой.

(«Приятно иметь», я хотел бы позволить UserFan на более поздний момент стать UserMusician, если они решат переключиться)

1 Ответ

1 голос
/ 09 марта 2019

Эффект Tje одинаков, независимо от того, используете ли вы User или settings.AUTH_USER_MODEL для указания связанной модели. Использование settings.AUTH_USER_MODEL делает ваше приложение более «подключаемым», так что его также можно использовать в проектах, использующих другую модель пользователя. Так что если вы хотите повторно использовать приложение или сделать его общедоступным, settings.AUTH_USER_MODEL наверняка будет лучшим определением, которое вы можете использовать.

Если вы хотите автоматически создать профиль при создании экземпляра User, вы можете использовать сигнал post_save Джанго для этого:

from django.db.models.signals import post_save
from models import UserMusician
from django.contrib.auth.models import User

def create_profile(sender, **kwargs):
    user = kwargs["instance"]
    if kwargs["created"]:
        UserMusician.objects.create(user=user)

post_save.connect(create_profile, sender=User)
...