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

2023-12-06

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

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


我已成功使用以下解决方案:
1. 创建SchoolUsermodels.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

视图是神奇发生的地方;)

def my_view(request):
    school_user = UserManager.factory(request.user)
    if school_user.do_something:  # each class can have different behaviour

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Django 中为两种类型的用户子类 AbstractUser 的相关文章

随机推荐

  • R Shiny 观察事件问题

    当在数据表中选择行并且有人按下 删除行 开关时 我试图从数据框中删除行 input click rows selected 给出所选行的 id 我使用observeEvent和observe似乎有问题 因为代码在我第一次轻按开关时删除了选定
  • Facebook 分享/评论无法正常工作

    在我的页面中 我添加了 Facebook 评论和分享按钮 一切都是按照他们的指示完成的 所以 我已经包含了加载脚本 div div
  • Facelets:使用 ui:param 将 bean 名称传递给操作属性

    由于某些自定义组件在其属性中需要 bean 名称 而不是 bean 实例 因此我需要在页面之间传递实际的 bean 名称 由于 bean 本身也被非自定义组件使用 我想避免使用额外的ui param 就像这里描述的那样在 中传递操作 因为它
  • 奇怪 - mysql 的 sql::SQLException 没有被它的类型捕获,而是被捕获为 std::exception 并成功地返回

    我正在使用 mysql c 连接器和这个 有点简化的 代码 try statement gt setString 1 word statement gt executeUpdate catch sql SQLException e I do
  • 如何以delphi形式使用Gif动画

    我认为 gif 动画图像没有原生支持 怎样才是最好的方法呢 任何允许这样做的免费组件 我正在考虑使用 TImage 和 ImageList Timer 但我需要将 gif 的每一帧导出到单独的 bmp 文件 在现代 Delphi 中这非常简
  • 使用 JSON 填充图表时 Google 图表中的工具提示

    我目前正在使用 JSON 填充我的 Google 图表 但我还需要自定义工具提示 目前我的 JSON 如下所示 cols id label date type string id label price type number rows c
  • python / scikit-learn 中距离计算的稀疏实现

    我有一个 svmlight 格式的大型 100K x 30K 且 非常 稀疏的数据集 加载如下 import numpy as np from scipy cluster vq import kmeans2 from scipy spati
  • 在 Ubuntu 上找不到 Java 应用程序主类

    我正在使用 Gradle 应用程序插件来分发适用于 Windows 和 Ubuntu Linux Mac 等的 Java 应用程序 几周前我在 Linux 上对此进行了测试 效果非常好 今天 在我的 Linux 机器上找不到我的 Main
  • Python 找不到 System32

    我想打开我创建的一个exe 它位于Windows的System32文件夹中 我通过以下命令执行此操作 subprocess call C Windows System32 ListTest exe 但不知何故Python找不到System3
  • java守护线程

    大家好 当封闭的线程完成时 守护线程会停止工作吗 或者当 主 线程完成时守护线程将停止 我在 jre6 上测试了这个例子 结果是daemon thread stopped working when the enclosing it thre
  • 如何使单击事件适用于具有同一类的多个元素?

    我试图在每次用户单击多个图块时实现翻转效果 这有点像仪表板类型网页的开始 如何使点击事件适用于多个同名类 所有图块都具有相同的类名 但在不同的 box div 下 jquery 单击事件似乎仅在添加的最后一个图块中实现 而其他图块保持静态
  • Bash 将带引号的行分割成参数

    希望这个问题以前没有出现过 至少我没有找到答案 也许看起来不太好 假设我收到了这段文字 hello hello hello world 请告诉我为什么这两个脚本有不同的输出 1 文本保存在文件中 bin bash while read li
  • 我需要回答有关 setTimeout 的问题

    所以我们都知道 setTimeout 在执行某些操作之前会等待一定的时间 我的问题是 它是否先等待上面的代码完成执行 然后再等待一秒钟执行其他操作 或者只是等待一秒钟 无论上面的代码是否已完成执行 它都会执行其余的代码无论如何 代码 if
  • 具有多个外键的 Django 内联表单

    我正在尝试在我的模板中使用 Django 的 ModelForm 和内联表单 但是 我找不到任何文档可以整齐地映射到具有多个外键的数据库模型回到同一个表 这些是我的模型 models py class Universities models
  • 使用 ADO 和 win32com 获取 SQL Server 消息

    我目前正在尝试编写一个工具 使不懂计算机的用户可以轻松备份 SQL Server 数据库 为此 我希望使用 ADO win32com 和 adodbapi 的有趣组合 目前我可以轻松连接到服务器并发出BACKUP DATABASET SQL
  • 无法使用密钥、证书和 CA 为 Tomcat 创建密钥库 证书链长度:1

    我无法获得从 RapidSSL 购买的证书 该证书在 Tomcat 上运行 但在 Apache 上运行 RapidSSL 要求您安装 2 个中间 ca 文件 当我从私钥 证书和中间 CA s 创建密钥库时 我可以看到 Entry type
  • 如何在 Zend Framework 中添加更新查询限制?

    我如何添加LIMIT 1使用 Zend Framework 时更新的子句 我有点被迫不使用Zend Db Table Abstract update 因为它会自行执行 与甜蜜不同Zend Db Select 课程 这样做的原因只是预防措施
  • Javascript无限嵌套数组处理

    我正在尝试和我的朋友一起玩 他解决了8m 7s中提到的问题 对我来说已经20m了 我不知道如何处理 JavaScript 中的无限嵌套数组 问题是这样的 i will be an array containing integers stri
  • 方向改变时相机出现问题

    我正在开发一个应用程序 当设备方向从横向变为纵向或反之亦然时 该应用程序会调用不同的活动 横向模式的活动是增强现实活动 因此我使用相机向用户展示周围环境 但是 当我尝试返回纵向时 应用程序崩溃并显示以下错误 08 17 16 05 42 6
  • 在 Django 中为两种类型的用户子类 AbstractUser

    我正在 Django 1 5 中开发一个学校数据库系统 并计划拥有许多不同的用户类型 学生 员工 家长 这些用户类型是 AbstractUser 的子类 实际上是 AbstractUser 的另一个抽象子类 我只是试图将外部开发的应用程序添