Django代理用户模型示例
我正在尝试为我的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继承。这样做的效果和你现在尝试的方式是一样的。