Django代理用户模型示例

Lud*_*udo 9 python django

我正在尝试为我的Django User模型添加一些自定义逻辑,并尝试使用代理用户模型.

我有一个这样的模型:

from django.contrib.auth.models import User

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

    class Meta:
        proxy = True
Run Code Online (Sandbox Code Playgroud)

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

TypeError: CustomUser cannot proxy the swapped model 'myapp.CustomUser'
Run Code Online (Sandbox Code Playgroud)

这可能吗?谢谢!

Edw*_*uza 6

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

方法一

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

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    pass
Run Code Online (Sandbox Code Playgroud)

方法2

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


在这两种方法之间,如果您要开始一个新项目,则首选#1(自定义模型),因为它为您提供了最大的控制权。但是,如果您已经有一个正在运行的项目,那么迁移到其他模型会有点棘手,因此方法#2(代理模型)可能是您能做的最好的选择。

有关更多详细信息,请参阅https://docs.djangoproject.com/en/3.2/topics/auth/customizing/#extending-the-existing-user-model 。


Dan*_*man -4

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

  • 文档中描述了 @Ludo 试图做的事情。从 AbstractUser 继承会对迁移等产生影响。他不会更改数据库,因此代理是正确的决定。为什么文档中描述的机制不起作用?就我而言,我遇到了相同的错误,但我的结构不同:我有一个 myapp/models/custom_user.py,其中有一个 myapp/models/__init__.py,我在其中导入 CustomUser 以使其可用。`AUTH_USER_MODEL` 如何在此结构中找到 CustomUser 类?我发现你不能做 `AUTH_USER_MODEL="myapp.models.CustomUser"` (15认同)