我想为模型添加一个便利/模型方法django.contrib.auth.models.User
。自从上次我检查以来,这样做的最佳做法是什么,扩展用户模型被认为是不好的做法。
我有一个单独的自定义UserProfile
模型。我应该将它用于所有与用户相关的便利方法吗?
我想为模型添加一个便利/模型方法django.contrib.auth.models.User
。自从上次我检查以来,这样做的最佳做法是什么,扩展用户模型被认为是不好的做法。
我有一个单独的自定义UserProfile
模型。我应该将它用于所有与用户相关的便利方法吗?
这取决于您要添加到模型中的内容。如果你想添加更多关于用户的信息,那么一般建议你使用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 及更高版本)
如果您想向 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
是的。当您的用户模型附加了 .get_profile() 函数时,无需弄乱基础。
2013 年更新:
在 1.5 中,您可以替换自定义用户模型并添加您想要的任何内容https://docs.djangoproject.com/en/dev/topics/auth/customizing/#auth-custom-user
我更喜欢在我开发的各种项目中使用相同的 UserProfile 并扩展 User 以满足任何项目特定的需求。因此,通用功能转到 UserProfile,项目特定功能转到自定义用户。我还没有对子类用户模型产生任何不利影响,我想知道 Django 1.0+ 是否仍然存在任何不利影响。