gpt4 book ai didi

django - 在 Django 中为两种类型的用户子类化 AbstractUser

转载 作者:行者123 更新时间:2023-12-04 12:52:53 24 4
gpt4 key购买 nike

我正在 Django 1.5 中开发一个学校数据库系统,并计划拥有许多不同的用户类型(学生、教职员工、家长),它们是 AbstractUser 的子类(实际上是 AbstractUser 的另一个抽象子类)。我只是试图向我的系统添加一个外部开发的应用程序,该应用程序在它的某些模型中使用外键中的用户,但是,这失败了,因为我的用户类型不是“用户”实例。我无法将应用程序模型设置为使用 AbstractUser,因为不能将抽象类用于外键。然后我考虑添加到我的 settings.py AUTH_USER_MODEL = 'myapp.MyUser'并使用 settings.AUTH_USER_MODEL 代替用户作为应用程序中的外键。但是,我有 3 种不同的用户类型,所以也不能这样做。

早期的原型(prototype)使用 Django 1.4,它不支持自定义 User 模型,因此有一个对 User 的引用,但这需要对每个查询进行额外的连接,这会导致非常复杂的查询。这是我可以继续进行的唯一方法,还是有其他解决方案?

最佳答案

我已成功使用以下解决方案:
1.创建SchoolUser models.py 中的类 - 这将是您的 AUTH_USER_MODEL类(class)

TYPES = (('Student', 'Student'), ('Staff', 'Staff'), ('Parent', 'Parent'), )
class SchoolUser(AbstractUser):
type = models.CharField(max_length=10, choices=TYPES, default='Student')

2. 创建 users.py 文件并将整个用户逻辑放在那里。有一个抽象类,所有其他类都继承自并将实现工厂方法:
class UserManager(object):
def __init__(self, user):
self.user = user

@classmethod
def factory(cls, user):
"""
Dynamically creates user object
"""
if cls.__name__.startswith(user.type): # Children class naming convention is important
return cls(user)
for sub_cls in cls.__subclasses__():
result = sub_cls.factory(user)
if result is not None:
return result

示例子类(也转到 users.py 文件):
class StudentUser(UserManager):
def do_something(self):
pass
class StaffUser(UserManager):
def do_something(self):
pass
class ParentUser(UserManager):
def do_something(self):
pass

View 是魔法发生的地方;)
def my_view(request):
school_user = UserManager.factory(request.user)
if school_user.do_something: # each class can have different behaviour

这样您就不需要知道它是哪种类型的用户,只需实现您的逻辑即可。
我希望这足够清楚,如果不是让我知道!

关于django - 在 Django 中为两种类型的用户子类化 AbstractUser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16682042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com