首页 > 解决方案 > 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)

标签: djangodjango-modelsdjango-2.1

解决方案


Tje 效果是一样的,不管你是使用User还是settings.AUTH_USER_MODEL指定相关模型。Usingsettings.AUTH_USER_MODEL使您的应用程序更加“可插拔”,因此它也可以在使用不同用户模型的项目中使用。因此,如果您想重用或向公众发布您的应用程序settings.AUTH_USER_MODEL肯定是您可以使用的最佳定义。

如果您想在创建User实例时自动创建配置文件,您可以使用Django 的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)

推荐阅读