【问题标题】:ModelName(django.contrib.auth.models.User) vs ModelName(models.Model)模型名称(django.contrib.auth.models.User)与模型名称(models.Model)
【发布时间】:2012-01-02 10:56:54
【问题描述】:

我正在开发一个 django 项目。我创建了一些应用程序,其中一些与用户模型相关,例如,我有一个处理用户提要的提要应用程序,以及另一个处理年龄、联系人和朋友等额外用户数据的应用程序。对于其中的每一个,我创建了一个应该连接到 User 模型的表,我用它来存储和验证用户。

我找到了两种方法来处理这个问题。一、是通过将User模型扩展成这样:

ModelName(User):
    friends = models.ManyToMany('self')
    .....

二,是通过像这样向新表添加外键:

ModelName(models.Model):
    user = models.ForeignKey(User, unique=True)
    friends = friends = models.ManyToMany('self')
    ......

我无法决定在哪种情况下使用哪个。换句话说,两者的核心区别是什么?

【问题讨论】:

  • 我认为这个问题是我正在寻找的
  • 不,我认为您根本没有在搜索。这个问题有几个重复。
  • 我不喜欢通过用户字段将配置文件模型连接到用户的想法,因为将一个用户实体额外分离到具有 2 个标识符和一堆字段的 2 个不同模型。在继承的情况下,您只需要用继承的新模块覆盖默认用户模块。因此,每个用户将只有一个 ID。

标签: django django-models web


【解决方案1】:

无论哪种方式在技术上都可行。继承 User 模型实际上与继承 models.Model 并包含 user = models.OneToOneField(User) 行相同。

也就是说,不管怎样,Django book 选择了models.Model 路由。我也同意这在语法上更简单。

我还将向您指出 Django 文档的 storing additional information about users 部分,该部分将教您有关 AUTH_PROFILE_MODULE 设置和 get_profile() 方法的信息。使用这些是非常好的做法。

【讨论】:

  • 我同意@Luke,从User 模型继承并不是一个好主意。创建UserProfile 模型是更好的做法。使用get_profile(),速度与任何其他解决方案一样快。
  • 从User 继承是一个糟糕的主意。但是这个答案并没有解释为什么。
  • 我看不出为什么从User 继承是一个本质上糟糕的主意(Django 允许模型继承是有原因的)。我只是认为遵循框架发布的最佳实践总是更好,在这种情况下,已经有一种 Django 方法可以完全完成 OP 想要的操作。
  • 我不喜欢通过 user 字段将配置文件模型连接到用户的想法,因为将一个用户实体与具有 2 个标识符和一堆字段的 2 个不同模型进行了额外的分离。在继承的情况下,您只需要用继承的新模块覆盖默认用户模块。因此,每个用户将只有一个 ID。
猜你喜欢
  • 2020-06-18
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 2014-12-28
  • 1970-01-01
  • 2010-11-05
相关资源
最近更新 更多