2009-10-29 115 views
7

我将如何使用自定义管理器来扩展默认用户模型?用户模型的Django自定义管理器

我的应用程序有许多用户类型,将使用内置的组模型进行定义。因此,用户可能是客户,员工等等。这将是理想的能够做到这样的事情:

User.clients.filter(name='Test') 

让所有的客户名称为测试。我知道如何使用用户定义模型的自定义管理器来做到这一点,但我不知道如何去实现User模型,同时仍然保留所有烘焙好的东西,至少不需要修改django源代码本身是一个无无....

回答

-1

你可以用户资料此

AUTH_PROFILE_MODULE = “accounts.UserProfile”

当用户简档模式已经 定义并且在指定的这样, 每个用户对象都会有一个方法 - get_profile( ) - 它返回与该用户关联的用户配置文件模型 的 实例。

或者您可以编写自己的authenticate backend。在设置中添加它

+1

-1用户配置文件适合添加额外的数据属性,但它们根本无助于这种情况。而你的最后一块代码很简单(你测试过了吗?),你不能像这样添加一个管理器到类中,你必须调用add_to_class方法,这样它才能正确设置。 – 2009-10-29 14:42:56

+0

它有助于使用配置文件模块,而不是用户。 UserProfile.user_clients.filter(name ='Test') 但是我的最后一块真的坏了。谢谢。我在编辑我的答案。 – Oduvan 2009-10-29 21:16:27

16

是的,您可以将自定义管理器直接添加到User类。这是monkeypatching,它确实使您的代码更容易维护(有人试图找出您的代码可能不知道用户类获得该自定义管理器,或他们可以找到它的地方)。在这种情况下,它是相对无害的,因为您实际上并没有重写User类的任何现有行为,只是添加了一些新内容。

from django.contrib.auth.models import User 
User.add_to_class('clients', ClientsManager()) 

如果你使用Django 1.1+,你也可以子类用户用proxy model;不会影响数据库,但可以让您在没有monkeypatch的情况下附加额外的管理器。

+0

有帮助,谢谢。 – 2010-01-14 10:12:01

+2

@JoseJose请将此答案标为正确 – sberder 2012-09-17 07:11:25

+0

非常普通,谢谢 – nemesisdesign 2013-06-21 18:00:55