我想在django.contrib.auth.models.User
模型中添加一个方便/模型方法。这样做的最佳做法是什么,因为上次我检查时,扩展用户模型被认为是不好的做法。
我有一个单独的自定义UserProfile
模型。我是否应该将其用于所有与用户相关的便利方法?
答案 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 +是否仍然存在。