gpt4 book ai didi

python - ForeignKey 和扩展 Django 中的 User 类/模型之间的区别

转载 作者:太空宇宙 更新时间:2023-11-03 17:32:40 24 4
gpt4 key购买 nike

Django: When extending User, better to use OneToOneField(User) or ForeignKey(User, unique=True)?

我浏览了这个线程,发现ForeignKey(带有unique=True)比OneToOneField更好,但是扩展类本身怎么样,即这是示例

class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
# some additional fields

或者

class UserProfile(User):
# some additional fields

这两种方法之间的差异和优缺点,我应该使用哪一种?

编辑:我也可以使用 AbstractUser

from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
phone_no = models.CharField(max_length=10, blank=True)

然后在settings.py中提到AUTH_USER_MODEL = 'myapp.User'

主要关心的是,我应该使用什么方法,扩展类还是ForeignKey?

重复:

What's the difference between OneToOne and Subclassing a model in Django

Django Model Inheritance versus OneToOne field

更多编辑

忘记 ForeginKey 或 OneToOne,假设仅存在这两者之一,现在将其与扩展/子类化方法进行比较

最佳答案

首先,很高兴知道目前有几种扩展 Django 用户模型的选项。每个都有其目的(但也有一些重叠)。 Django 文档有点令人困惑,因为它似乎来自 this有两个选项,即代理或 OneToOneField。然而,这与现有用户模型有关,因为文档的后续部分将讨论自定义用户模型。

因此,在实践中,有四种(常见)方法来处理扩展用户模型:

  1. 代理模型(没有新的数据库字段,只是为了更改用户模型行为,即新排序、新方法等)。
  2. OneToOneField(现有 Djang 用户模型中需要额外的数据字段)。
  3. 使用 AbstractBaseUser 自定义用户模型(额外数据字段所需的以及有关身份验证过程的具体要求,例如使用电子邮件地址 als id token 而不是用户名)。
  4. 使用 AbstractUser 自定义用户模型(需要额外的数据字段,不需要更改为身份验证)。

实现选项 3 和 4 需要全新的数据库迁移,因此这些仅适用于新项目。

This is a good link for more detail on this 。我认为选项 2 和 4 最接近,因为两者都只想扩展以添加更多数据字段。作家似乎赞成选项 2,但当开始一个新项目时,选项 4 对我来说似乎更容易。作者在评论中的某个地方提到了选项 3 和 4 无法升级到新 Django 版本的风险。对我来说似乎有些牵强,但我真的不能说。

关于python - ForeignKey 和扩展 Django 中的 User 类/模型之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31670393/

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