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

Sov*_*iut 22 django django-models django-authentication

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

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

Gar*_*ers 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
Run Code Online (Sandbox Code Playgroud)

代理模型将在与原始模型相同的数据库表上运行,因此非常适合创建自定义方法而无需物理扩展模型.只需将User视图中的任何引用替换为UserMethods.(当然,您可以通过取消注册User模型并注册代理模型来在管理工具中使用它.)

User创建的原始模型的任何实例都可以通过UserMethods模型立即访问,反之亦然.更多信息:http://docs.djangoproject.com/en/dev/topics/db/models/#proxy-models

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

  • 有没有一种简单的方法可以将request.user的类型更改为代理类型?这是必要的,还是可以直接在request.user上调用代理方法? (14认同)
  • 我和@slacy有同样的疑问,并找到了解决方法:/sf/answers/806823461/.基本上,您必须子类化django.contrib.auth.backends.ModelBackend,在get_user上返回UserMethods,并在AUTHENTICATION_BACKENDS上设置它. (3认同)

suh*_*lvs 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)
Run Code Online (Sandbox Code Playgroud)

并将其导入应用程序的__init__.py文件中.即::

#app/__init__.py
import monkey_patching
Run Code Online (Sandbox Code Playgroud)