gpt4 book ai didi

python - Django - 使用配置文件扩展用户模型,但也使用不同的用户类型

转载 作者:太空宇宙 更新时间:2023-11-03 21:07:11 26 4
gpt4 key购买 nike

我想扩展 Django (2.2) 中的用户模型,并将其与也具有特定字段的 Host 和 Guest 实体结合起来。

official documentation ,建议创建一个“Profile”类,其中包含引用 User 主键的 OneToOne 字段。

我可以看到 3 种方法:

解决方案 1:配置文件、主机和访客模型:

class Profile(models.Model):
k_user = models.OneToOneField(User, on_delete=models.CASCADE)
language = models.CharField(max_length=2)

class Host(models.Model):
k_user = models.OneToOneField(User, on_delete=models.CASCADE)
host_field= models.CharField(max_length=500)

class Guest(models.Model):
k_user = models.OneToOneField(User, on_delete=models.CASCADE)
guest_field = models.BooleanField(null=False)

解决方案 2:主机和访客模型(配置文件字段重复)

class Host(models.Model):
k_user = models.OneToOneField(User, on_delete=models.CASCADE)
language = models.CharField(max_length=2)
host_field = models.CharField(max_length=500)

class Guest(models.Model):
k_user = models.OneToOneField(User, on_delete=models.CASCADE)
language = models.CharField(max_length=2)
guest_field = models.BooleanField(null=False)

解决方案 3:配置文件模型(包含 Guest 和 Host 字段)

class Profile(models.Model):
k_user = models.OneToOneField(User, on_delete=models.CASCADE)
language = models.CharField(max_length=2)
is_host = models.BooleanField(null=False)
guest_field = models.BooleanField(null=False)
host_field = models.CharField(max_length=500)

所有这些解决方案都有效。

我的问题是:“综合考虑,哪一个是最聪明的”(更少的数据库访问、更少的代码编写、更容易维护、更少的限制等等)

最佳答案

深入研究 Django 文档并阅读 article mentioned by @sam 后解释了如何在 Django 中实现多用户类型,我找到了答案。

写在 Django doc “强烈建议设置自定义用户模型,即使默认用户模型足以满足您的需求”。

这是我的案例中给出的内容:

class User(AbstractUser):
is_guest = models.BooleanField(default=False)
is_host = models.BooleanField(default=False)
language = models.CharField(max_length=2)


class Host(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
host_field = models.CharField(max_length=500)


class Guest(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
guest_field = models.BooleanField(null=False)

在settings.py中:

AUTH_USER_MODEL = 'path.to.User'

创建新用户时插入访客或主持人记录:

  user = User.objects.create_user(...)

if is_host:
Host.objects.create(user=user)
else:
Guest.objects.create(user=user)

我很高兴能够检测请求对象中的用户“类型”(使用 request.user.is_host)。

通过扩展用户类,您还可以使用email字段进行登录,并使其唯一:

class User(AbstractUser):
[...]
email = models.EmailField(unique=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []

如果在生产中您选择在用户模型中添加字段,则如果您设置了自定义用户模型,则可以这样做。

否则你会被配置文件困住,所以我建议你遵循 Django 的指南并始终扩展用户类,即使你还不需要它。

关于python - Django - 使用配置文件扩展用户模型,但也使用不同的用户类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55323905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com