【问题标题】:Django model design adviceDjango 模型设计建议
【发布时间】:2019-08-10 03:54:37
【问题描述】:

我目前正在学习 Django,特别是 DRF 来制作一个将由 Web 应用程序客户端使用的 API。该应用程序适用于教授数学和科学课外课程的老师。我的基本想法是会有两种类型的用户,学生和教师。教师显然比学生拥有更多的访问权限。问题是,django 用户类具有 is_admin 属性,并且由于只有教师可能是站点的管理员,因此我无法创建具有 is_admin 和 user_type 属性的单个用户类。例如,具有 is_admin=True 和 user_type=Student 的用户将是无效组合。我的想法是将我的用户类作为抽象基类,然后创建两个独立的类,学生和教师,它们继承自它。从只有教师可以发表文章的意义上说,这也是理想的,这意味着学生类将没有该权限,但是我面临另一个问题。所有用户都有一个配置文件。 Profile 将存储用户的个人简介、头像图像等。但是在 Profile 中设置 OneToOneField 关系时,profile 必须与 Student 和 Teachers 具有该关系,因此是所有 User 类型。我该如何建立这种关系?我可以说 OneToOneField(User) 并且由于继承,用户可能是学生或教师吗?如果没有,我该怎么办?

如果您有经验并且正在思考,他(即我)到底为什么要这样做?请随时评论我的设计计划,并告诉我一个更好的设计会是什么样子。提前致谢。

编辑:为每个用户提供一个个人资料、存储个人简介和图像等有什么好处吗?与将这些信息存储在 User 模型中相比,这样做有什么好处吗?

【问题讨论】:

    标签: django api django-models django-rest-framework backend


    【解决方案1】:

    不要创建单独的类。只是它们具有不同的权限并不意味着它们需要是不同的类!它们都可以是User(或您自己的子类,但相同)。

    然后您配置两个不同的 (docs)。您将每个新用户分配到两个组之一。

    然后,您的代码可以使用一些自定义权限(比如对文章的“发布”权限)并将该权限授予教师组,并在您的代码中检查当前用户是否具有该权限。

    通常只有一个或几个用户拥有“is_admin”,is_admin 意味着您自动拥有所有现有权限。它用于用户管理、配置组等。

    【讨论】:

      【解决方案2】:

      除非您需要每个类具有不同的属性,否则请将其保留为一个类。但在你的情况下,你可以让 is_staff=True 成为教师的同义词,然后你可以摆脱 user_type 属性。通常更好的做法是使用布尔字段而不是 char 字段,这些字段具有有限的选择集,这些选择在代码中执行未知操作。因此,工作人员将是教师,非工作人员将是学生。

      旁白:“is_admin”是指“is_staff”,对吧?我不知道 django User 模型有一个“is_admin”属性,只有 is_staff 和 is_superuser。

      【讨论】:

      • 我的意思是超级用户,对不起:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多