Django代理用户模型示例

12 投票
2 回答
4935 浏览
提问于 2025-04-18 16:06

我正在尝试为我的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的命令行中使用CustomUser,但我原本以为可以在设置中指定AUTH_USER_MODEL,这样在我的应用中就能默认使用这个用户模型(就像使用完全自定义的用户模型一样),但事实并不是这样。当我尝试设置AUTH_USER_MODEL后运行时,我遇到了:

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

这可能吗?谢谢!

2 个回答

6

AUTH_USER_MODEL 设置为自定义类和使用代理模型是两种不同的方法来定制 Django 的用户模型行为。你看到这个错误是因为你把这两种方法混在一起了,这样做是不合理的。

方法一

如果你设置 AUTH_USER_MODEL='myapp.CustomUser',那么就不应该使用代理模型。你应该这样定义你的自定义用户模型:

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    pass

方法二

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


在这两种方法中,如果你是从头开始一个新项目,方法一(自定义模型)是更好的选择,因为它给你更多的控制权。不过,如果你已经有一个正在运行的项目,迁移到不同的模型会有点麻烦,所以方法二(代理模型)可能是你能做的最好的选择。

想了解更多细节,可以查看 这个链接

-4

你可以直接使用一个完全自定义的用户类,这个类可以从AbstractUser继承。这样做的效果和你现在尝试的方式是一样的。

撰写回答