【问题标题】:Django proxy User model exampleDjango 代理用户模型示例
【发布时间】:2014-08-05 17:01:40
【问题描述】:

我正在尝试向我的 Django 用户模型添加一些自定义逻辑,并尝试使用代理用户模型来实现。

我有一个类似这样的模型:

from django.contrib.auth.models import User

class CustomUser(User):
    def custom_method(self):
        return 'Something'

    class Meta:
        proxy = True

如果我省略 AUTH_USER_MODEL 设置,那么我可以运行 Django shell 并非常愉快地使用 CustomUser,但是,我认为我可以在我的设置中设置 AUTH_USER_MODEL,所以这是我的默认用户应用程序(例如当您使用完全自定义的用户模型时),但情况并非如此,当我尝试使用 AUTH_USER_MODEL 设置运行时,我得到:

TypeError: CustomUser cannot proxy the swapped model 'myapp.CustomUser'

这可能吗?谢谢!

【问题讨论】:

    标签: python django


    【解决方案1】:

    AUTH_USER_MODEL 设置为自定义类和使用代理模型是自定义Django 用户模型行为的两种不同方法。您看到该错误是因为您将它们混合在一起,这是没有意义的。

    方法一

    如果你设置了AUTH_USER_MODEL='myapp.CustomUser' 那么你不应该代理任何东西。像这样定义您的自定义用户模型:

    from django.contrib.auth.models import AbstractUser
    
    class CustomUser(AbstractUser):
        pass
    

    方法2

    像上面那样代理 Django 用户模型。不要设置AUTH_USER_MODEL。在您的代码中,确保您始终导入和使用您的 CustomUser 类。


    在这两种方法中,如果您要开始一个新项目,则首选方法 2,因为它可以为您提供最大的控制权。但是,如果您已经有一个正在运行的项目,那么迁移到不同的模型有点棘手,因此使用代理的方法 #1 可能是您能做的最好的。

    更多详情请见https://docs.djangoproject.com/en/3.2/topics/auth/customizing/#extending-the-existing-user-model

    【讨论】:

      【解决方案2】:

      您不妨使用继承自 AbstractUser 的完全自定义用户。这与您在此处尝试的功能完全相同。

      【讨论】:

      • 我只是在尝试文档中提到的代理模型,但您的建议效果很好 - 谢谢! :)
      • 文档中描述了@Ludo 尝试做的事情。从 AbstractUser 继承对迁移等有影响。他没有更改数据库,因此代理是正确的决定。为什么文档中描述的机制不起作用?在我的情况下,我得到了同样的错误,但我的结构不同:我有一个 myapp/models/custom_user.py 和一个 myapp/models/__init__.py,我在其中导入了 CustomUser 以使其可用。 AUTH_USER_MODEL 如何在这个结构中找到 CustomUser 类?我发现你不能做AUTH_USER_MODEL="myapp.models.CustomUser"
      猜你喜欢
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多