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