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