django - 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)
解决方案
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)
推荐阅读
- typo3 - Gridelements 中的 DCE 不起作用(空字段) - TYPO3 10.4
- mysql - 这是仅将 MySQL 导入错误记录到文件中的正确命令吗?
- powershell - Expand-7zip Foreach 用法
- javascript - 如何在 HTML 中给出 javascript 路径
- aws-lambda - 在 serverless.template 中添加自定义授权者
- type-conversion - 相互减去两个日期列
- rxjs - 如何组合代表两种不同逻辑的 RXJS 表达式?
- python - 如何将此点符号 JSON 放入数据框中?
- vue.js - Vuetify:带有服务器分页的多排序
- .net-core - Oracle19c 实体框架 ORA-00001 违反了唯一约束