为Django Auth User模型添加便捷方法的最佳方法是什么?

时间:2009-11-30 06:52:06

标签: django django-models django-authentication

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

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

5 个答案:

答案 0 :(得分:29)

这取决于您要添加到模型中的内容。如果您想添加有关用户的更多信息,通常建议您使用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

(NB。代理模型需要Django 1.1及以上版本)

答案 1 :(得分: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文件中。即:

#app/__init__.py
import monkey_patching

答案 2 :(得分:4)

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

答案 3 :(得分:3)

2013年更新:

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

答案 4 :(得分:-1)

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