Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 2.1-将用户链接到相关模型_Django_Django Models_Django 2.1 - Fatal编程技术网

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

Django 2.1-将用户链接到相关模型,django,django-models,django-2.1,Django,Django Models,Django 2.1,我正在创建一个Django项目,我想创建两种不同用户类型的配置文件作为一个单独的模型。他们将与登录用户建立OneToOneField关系 class UserMusician(models.Model): ... class UserFan(models.Model): ... 我见过两种不同的方法。一个,根据Django 2.1,文档显示传入用户模型,即: from django.contrib.auth.models import User class UserMusi

我正在创建一个Django项目,我想创建两种不同用户类型的配置文件作为一个单独的模型。他们将与登录用户建立OneToOneField关系

class UserMusician(models.Model):
    ...

class UserFan(models.Model):
    ...
我见过两种不同的方法。一个,根据Django 2.1,文档显示传入
用户
模型,即:

from django.contrib.auth.models import User

class UserMusician(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
而其他示例,如Django book的两个勺子,则建议传递
设置.AUTH_USER_MODEL
,即:

from django.conf import settings

class UserMusician(models.Model):
    user = models.OneToOneField(settings.AUTH.USER.MODEL)
谁能告诉我两者的区别是什么,它们的优缺点是什么

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


(作为“很高兴拥有”,我希望允许一个用户粉丝在以后决定切换时成为一个用户音乐家)

Tje效果是相同的,无论您使用
User
settings.AUTH\u User\u MODEL
来指定相关的模型。使用
settings.AUTH\u USER\u MODEL
使您的应用程序更“可插拔”,这样它也可以用于使用不同用户模型的项目中。因此,如果您想将应用程序重新使用或发布到公共
设置中,AUTH\u USER\u MODEL
无疑是您可以使用的最佳定义

如果要在创建
用户
实例时自动创建配置文件,可以使用:

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)

这太棒了!非常感谢。接下来的两个问题:我想把
post_save
代码块也放在profiles/models.py文件中的类中,还是放在其他地方?如果我同时创建
def create_musier_profile
def create_fan_profile
,我如何防止在创建新用户帐户时创建这两个配置文件?只要确保至少执行一次
post_save.connect()
,您就可以将代码放在任何地方,所以
models.py
就可以了。您可以将任意多个函数连接到一个信号,但不知道如何确定要创建哪种配置文件(当然,您也可以在一个信号处理程序中处理这两种配置文件)