Django用户模型自定义管理器
我该如何扩展默认的用户模型,添加自定义管理器呢?
我的应用里有很多种用户类型,这些类型会通过内置的组模型来定义。所以一个用户可能是客户、员工等等。理想情况下,我希望能做到类似这样的事情:
User.clients.filter(name='Test')
这样就能获取所有名字为“Test”的客户。我知道如何使用自定义管理器来处理用户自定义的模型,但我不太确定如何在保留所有内置功能的情况下,对用户模型进行这样的操作,当然,我也不想去修改django的源代码,这样是不行的……
2 个回答
-2
你可以使用 Profile 来实现这个功能。
AUTH_PROFILE_MODULE = 'accounts.UserProfile'
当你定义了一个用户资料模型,并且像这样指定后,每个用户对象都会有一个方法 -- get_profile() -- 这个方法会返回与该用户关联的用户资料模型的实例。
或者你可以自己写一个 认证后端。然后把它添加到设置中。
18
是的,你可以直接给用户类添加一个自定义管理器。这种做法叫做“猴子补丁”,虽然可以实现你的需求,但会让代码变得不太好维护。因为其他人如果想理解你的代码,可能会搞不清楚这个用户类是从哪里来的这个自定义管理器,或者应该去哪里找它。不过在这种情况下,影响不大,因为你并没有改变用户类原有的功能,只是添加了一些新东西。
from django.contrib.auth.models import User
User.add_to_class('clients', ClientsManager())
如果你使用的是Django 1.1或更高版本,你也可以通过创建一个代理模型来对用户类进行子类化;这样做不会影响数据库,但可以让你在不使用猴子补丁的情况下添加额外的管理器。