Django 2.1-将用户链接到相关模型

时间:2019-03-09 15:08:15

标签: django django-models django-2.1

我正在创建一个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)

其他示例(例如 Django的两个独家新闻书)建议传递settings.AUTH_USER_MODEL,即:

from django.conf import settings

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

谁能告诉我差异是什么,两者的优点和缺点是什么?

我希望在创建一个或另一个用户帐户时在数据库中生成这些配置文件。

(作为“一个不错的选择”,如果他们决定切换,我希望以后允许UserFan成为UserMusician)

1 个答案:

答案 0 :(得分:1)

无论使用User还是settings.AUTH_USER_MODEL指定相关模型,效果都是相同的。使用settings.AUTH_USER_MODEL使您的应用程序更“可插入”,因此它也可以在使用不同用户模型的项目中使用。因此,如果您想重用或向公众发布应用程序,settings.AUTH_USER_MODEL无疑是您可以使用的最佳定义。

如果要在创建User实例时自动创建配置文件,则可以使用Django's post_save signal来执行此操作:

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)