【问题标题】:Django Custom Managers for User model用户模型的 Django 自定义管理器
【发布时间】:2009-10-29 10:31:05
【问题描述】:

如何使用自定义管理器扩展默认用户模型?

我的应用有许多将使用内置组模型定义的用户类型。因此,用户可能是客户、员工等。能够执行以下操作将是理想的:

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

获取名称为 Test 的所有客户端。我知道如何使用用户定义模型的自定义管理器来做到这一点,但我不确定如何在用户模型上做这件事,同时仍然保留所有烘焙好的东西,至少不修改 django 源代码本身就是一个不号......

【问题讨论】:

    标签: python django


    【解决方案1】:

    是的,您可以直接将自定义管理器添加到 User 类。这是猴子补丁,它确实使您的代码更难维护(试图弄清楚您的代码的人可能不知道 User 类在哪里获得了该自定义管理器,或者他们可以在哪里找到它)。在这种情况下,它相对无害,因为您实际上并没有覆盖 User 类的任何现有行为,只是添加了一些新内容。

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

    如果您使用的是 Django 1.1+,您还可以使用 proxy model 子类化 User;不会影响数据库,但允许您在没有猴子补丁的情况下附加额外的管理器。

    【讨论】:

    • “代理模型”+1。我个人不鼓励对这个问题使用猴子补丁。
    • 这个猴子补丁的问题是它将替换默认模型管理器
    【解决方案2】:

    您可以为此使用个人资料

    AUTH_PROFILE_MODULE = 'accounts.UserProfile'

    当用户配置文件模型已经 以这种方式定义和指定, 每个用户对象都会有一个方法—— get_profile() -- 返回 用户配置文件模型的实例 与该用户相关联。

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

    【讨论】:

    • -1 用户配置文件非常适合添加额外的数据属性,但它们对这种情况根本没有帮助。而且你最后的代码块被破坏了(你测试了吗?),你不能像这样向一个类添加管理器,你必须调用 add_to_class 方法才能正确设置。
    • 这有助于使用配置文件模块而不是用户。 UserProfile.user_clients.filter(name='Test') 但是我的最后一个块真的坏了。谢谢。我正在编辑我的答案。
    猜你喜欢
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2011-04-20
    • 1970-01-01
    • 2021-12-13
    • 2013-12-04
    相关资源
    最近更新 更多