向 Django Auth User 模型添加便利方法的最佳方法?

Posted

技术标签:

【中文标题】向 Django Auth User 模型添加便利方法的最佳方法?【英文标题】:Best way to add convenience methods to a Django Auth User model? 【发布时间】:2010-12-21 13:15:45 【问题描述】:

我想为django.contrib.auth.models.User 模型添加一个便利/模型方法。这样做的最佳做法是什么,因为上次我检查时,扩展用户模型被认为是不好的做法。

我有一个单独的自定义 UserProfile 模型。我应该将它用于所有与用户相关的便捷方法吗?

【问题讨论】:

【参考方案1】:

是的。当您的用户模型附加了 .get_profile() 函数时,无需弄乱基础。

【讨论】:

+1,仍然不推荐扩展 User 模型,并且配置文件的所有管道都已经可以使用。 您可以在配置文件模型上添加OneToOne 字段并调用user_instance.profile 而不是使用get_profile()【参考方案2】:

我更喜欢在我开发的各种项目中使用相同的 UserProfile,并扩展 User 以满足任何项目特定的需求。因此,通用功能转到 UserProfile,项目特定功能转到自定义用户。我还没有对子类化 User 模型产生任何不利影响,我想知道 Django 1.0+ 是否仍然存在任何不利影响。

【讨论】:

【参考方案3】:

这取决于您要添加到模型中的内容。如果你想添加更多关于用户的信息,那么一般建议你使用UserProfile方法:http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

但是,如果您只是想将自定义方法或管理器添加到 User 模型中,我会说使用代理模型更合乎逻辑,如下所示:

from django.contrib.auth.models import User

class UserMethods(User):
  def custom_method(self):
    pass
  class Meta:
    proxy=True

代理模型将在与原始模型相同的数据库表上运行,因此非常适合创建自定义方法而无需物理扩展模型。只需将您视图中对User 的任何引用替换为UserMethods。 (当然,您可以通过取消注册 User 模型并注册您的代理模型来在管理工具中使用它。)

创建的原始User 模型的任何实例都可以通过UserMethods 模型立即访问,反之亦然。更多内容:http://docs.djangoproject.com/en/dev/topics/db/models/#proxy-models

(注意,代理模型需要 Django 1.1 及更高版本)

【讨论】:

好电话!完全忘记了代理模型。我正在运行 1.1,但正在以 1.0 的心态思考。 有没有一种简单的方法可以将 request.user 的类型更改为代理类型?有必要吗,或者我可以直接在 request.user 上调用代理方法吗? 我和@slacy 有同样的疑问,并在这个答案上找到了方法:***.com/a/11526049/188614。基本上,你必须继承 django.contrib.auth.backends.ModelBackend,在 get_user 上返回 UserMethods,然后在 AUTHENTICATION_BACKENDS 上设置它。 这个指向 Django 文档的链接现在已损坏。有人知道新网址吗?【参考方案4】:

2013 年更新:

在 1.5 中,您可以替换自定义用户模型并添加您想要的任何内容https://docs.djangoproject.com/en/dev/topics/auth/customizing/#auth-custom-user

【讨论】:

【参考方案5】:

如果你想为 User 模型添加自定义方法,我推荐monkey_patching:

在您的任何apps:: 中创建一个文件monkey_patching.py

#app/monkey_patching.py
from django.contrib.auth.models import User 

def get_user_name(self):
    if self.first_name or self.last_name:
        return self.first_name + " " + self.last_name
    return self.username

User.add_to_class("get_user_name",get_user_name)

并将其导入应用程序的__init__.py 文件。即::

#app/__init__.py
import monkey_patching

【讨论】:

以上是关于向 Django Auth User 模型添加便利方法的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

添加到 auth_user [重复]

数据库错误:没有这样的表:auth_user。扩展 AbstractUser 并使用模型在管理员上注册

将 Django auth UserAdmin 用于自定义用户模型

管理员中的 Django 自定义用户模型,关系“auth_user”不存在

将现有 auth.User 数据迁移到新的 Django 1.5 自定义用户模型?

在 Django rest framework 中,在使用自定义模型时,我需要给 AUTH_USER_MODEL 啥值?