22

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

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

4

5 回答 5

30

这取决于您要添加到模型中的内容。如果你想添加更多关于用户的信息,那么一般建议你使用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 及更高版本)

于 2009-11-30T12:17:53.657 回答
14

如果您想向 User 模型添加自定义方法,我建议您使用monkey_patching

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

#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文件中。IE::

#app/__init__.py
import monkey_patching
于 2014-07-10T03:54:16.033 回答
4

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

于 2009-11-30T07:06:24.977 回答
3

2013 年更新:

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

于 2013-01-16T22:07:30.013 回答
-1

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

于 2009-11-30T07:58:58.350 回答