中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Django中處理多用戶類型

發布時間:2021-05-20 17:12:29 來源:億速云 閱讀:240 作者:Leah 欄目:開發技術

如何在Django中處理多用戶類型?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

1. 不要使用 Django 內置的 User 模型,盡管它能滿足應用程序的所有要求。

正如官方Django文檔強烈建議為新項目使用自定義用戶模型。需求總是在變,只用固定的模型不太現實,并且一旦設置了 AUTH_USER_MODEL 后續再修改就很麻煩了。

2.無論最后選擇什么方案,無論有什么業務,都始終只使用一個 Django 模型來處理身份驗證。

永遠都使用一個用戶模型,這就是標題為什么是處理多用戶類型而不是多用戶模型。這也就能使用統一的身份認證機制。它仍然可以擁有多種用戶類型。

方案

不同的項目要求設計出來的方案也是不同的,不妨先問問自己這幾個問題:

  • 需要維護多少種用戶類型?

  • 用戶可以同時擁有多種角色嗎?比如用戶可以同時成為學生或老師嗎?

  • 不同用戶類型是否需要存儲不同的信息?

一種非常常見的情況就是擁有普通用戶和管理員。在這種場景下,可以使用內置的 is_staff 來區分普通用戶和管理員。實際上,內置模型中有兩個字段來處理這種情況:is_staff 和 is_superuser 。is_staff 標志著用戶是否允許登錄 Django Admin 頁面,至于該用戶能做什么或不能做什么,就由權限框架來授權。而 is_superuser 是一個額外的標志,意味著擁有所有權限。所以這里可以看出來,權限有兩個級別的管理。

需要維護多少種用戶類型? 如果類型數量比較少,那就可以效仿Django的方式,用幾個字段來簡單表示:

class User(AbstractUser):
  is_student = models.BooleanField(default=False)
  is_teacher = models.BooleanField(default=False)

這可能是處理多種用戶類型最簡單的方法了。

另一種選擇是,只用一個字段就來表示用戶:

class User(AbstractUser):
 USER_TYPE_CHOICES = (
   (1, 'student'),
   (2, 'teacher'),
   (3, 'secretary'),
   (4, 'supervisor'),
   (5, 'admin'),
 )

 user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES)

超過 3 種類型可以選擇這種方式。

用戶可以同時擁有多種角色嗎?

如果用戶是可以同時承擔多種角色的話,那么就需要一個額外的表表示它們多對多的關系,顯然可以用到 ManyToManyField :

class Role(models.Model):
 '''
 The Role entries are managed by the system,
 automatically created via a Django data migration.
 '''
 STUDENT = 1
 TEACHER = 2
 SECRETARY = 3
 SUPERVISOR = 4
 ADMIN = 5
 ROLE_CHOICES = (
   (STUDENT, 'student'),
   (TEACHER, 'teacher'),
   (SECRETARY, 'secretary'),
   (SUPERVISOR, 'supervisor'),
   (ADMIN, 'admin'),
 )

 id = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, primary_key=True)

 def __str__(self):
   return self.get_id_display()

class User(AbstractUser):
 roles = models.ManyToManyField(Role)

這種方案其實并不常見,因為Django已經提供權限組的功能并擁有靈活的權限管理。你得評估下創建自定義權限組是否更好。

不同用戶類型是否需要存儲不同的信息? 如果存儲的信息(如頭像)與所有用戶相關,那么最好的做法就是直接向用戶模型添加額外的字段。

如果儲存的信息只與特定的類型用戶有關,那么可以用 OneToOneField 來進行拓展:

from django.contrib.auth.models import AbstractUser
from django.db import models

class User(AbstractUser):
  is_student = models.BooleanField(default=False)
  is_teacher = models.BooleanField(default=False)

class Student(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
  ...

class Teacher(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
  ...

總結

可以參照如下的流程圖來幫助設計:

如何在Django中處理多用戶類型

關于如何在Django中處理多用戶類型問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

克东县| 宜君县| 商都县| 涞源县| 三门峡市| 荥经县| 察雅县| 海晏县| 满洲里市| 永德县| 广昌县| 隆昌县| 吴桥县| 灵宝市| 海口市| 岳阳县| 五原县| 黑龙江省| 名山县| 岗巴县| 岐山县| 屏东市| 凌海市| 肥东县| 安徽省| 莆田市| 南京市| 高密市| 东莞市| 象山县| 临泽县| 东阿县| 阿克苏市| 河源市| 全南县| 新营市| 田东县| 柏乡县| 新邵县| 绥德县| 庄河市|