當前位置:
首頁 > 最新 > django 自帶 user 欄位擴展及頭像上傳

django 自帶 user 欄位擴展及頭像上傳

碼個蛋第318次推文

作者:Kuky_xs

博客:https://www.jianshu.com/p/b74107b6464d

系列文章

《django入門:環境及項目搭建》

《django入門:數據模型》

《django入門:視圖及模版》

《django入門:Admin管理系統及表單》

《django入門:通用視圖類重構視圖》

《用django寫介面(入門篇)》

《用django寫介面(優化篇)》

《用django寫介面(實戰篇)》

1

擴展 django 的 User Model 欄位

在實際項目中,django 自帶的 user model 的欄位很多時候不能夠滿足我們的需求,可能我們需要在 user 中加入商城積分等欄位,這就需要通過擴展的 user model 欄位來實現。目前擴展 user 欄位我找到的有 4 種方式。

1. 通過新建 model 然後指定 OneToOne 的 user 欄位(官方推薦)

接著需要在 admin 做些設置

然後通過遷移資料庫,django 會同時生成 user 表和 user_profile 表

這個方法雖然是官方推薦的,但是個人還是覺得很麻煩,獲取 profile 的欄位值還需要通過 user 表的外鍵獲取 profile 實例,然後再獲取欄位值,再考慮到 django 的通過外鍵生成反向欄位也需要做些處理,如果說我們只需要額外添加一個欄位,需要做那麼多工作,我是拒絕的。

2. 通過繼承 AbstractUser 來實現

首先需要在 models.py 文件中創建自己的 user model

然後我們需要在 settings.py 文件中設置 AUTH_USER_MODEL 的值

在 admin 中,我們按照之前的方法照常設置就行

這種方法,需要在我們做資料庫遷移之前,先定義好我們自己的 User Model 然後將 settings.py 文件中的 AUTH_USER_MODEL 替換後再進行資料庫遷移,需要告訴 django 系統,這個項目我要用自己的 User 了,不用你的。這種方法適合只需要擴展 User Model 中的欄位,會繼承之前 AbstractUser 的全部欄位,系統自帶的 User 也是通過繼承 AbstractUser 來實現的

如果說系統自帶的 user 很多欄位都不符合項目的需要,基本上需要完全替換,那目前提到的兩種方法都不適合,需要通過第三種方法來替換

3. 通過 AbstractBaseUser 替換 User

這種方法會比較麻煩,說實話前兩種方法已經可以解決我們的問題,不到迫不得已個人覺得沒必要用這種方法

在 UserManager 中,需要通過 create_user 和 create_superuser 的方法來創建用戶和超級用戶,所以必須重寫這些方法才可以,這裡根據系統的 UserManager 源碼進行修改

替換 User 中的 UserManager,然後還是需要在 settings.py 文件中設置 AUTH_USER_MODEL 為自定義的 User Model

通過 2 , 3 方法擴展 User Model 後,當別的表和 User 表有鏈表結構的時候,最好通過 settings.AUTH_USER_MODEL 進行導入,而不是通過 User 直接導入,還有需要注意的是,一定要先把擴展的 User Model 先進行數據遷移,否則會產生不必要的麻煩。而官方推薦的則可以不用考慮這個問題

4. 通過元類進行擴展

在網上還找到一種通過元類來擴展欄位的方法,這邊附上鏈接 通過元類擴展 User 欄位不多講述。

5. User 欄位擴展實踐

擴展後的返回欄位如下圖

register_result

login_result

2

通過 ImageField 上傳頭像

上傳頭像之前,需要先安裝 Pillow 模塊 pip install pillow,然後在我們的 settings.py 文件中加入如下代碼

接著在 model 類中加入 ImageField 屬性的欄位,例如 avatar,再做資料庫遷移,如果沒有安裝 pillow 模塊,資料庫遷移是會被打斷的,然後提示你需要安裝 pillow

資料庫遷移後修改 serializers 文件,添加 UploadAvatarSerializer,我們需要客戶端回傳的數據包括圖片,以及圖片的後綴名,如果自己去獲取後綴名,通過 pillow 轉換再取後綴可能會比較麻煩,所以直接讓前端上傳,所以我們定義的 serializer 如下:

接著來完成我們的 view 視圖

注釋能看懂的小夥伴就可以跳過這部分啦,沒完全懂的小夥伴繼續跟上節奏~首先我們需要添加許可權,需要用戶登錄後才可以進行修改或者上傳頭像,所以指定 permission_classes 為 permissions.IsAuthenticated,可以看下 IsAuthenticated 的源碼

認證由於用的是 Android 端,所以直接使用系統的 TokenAuthentication,parser_classes 和 renderer_classes 基本每個 view 都類似,但是涉及到圖片上傳,一定要添加 FileUploadParser

用戶端上傳圖片後,我們直接保留到項目下。首先需要通過 is_valid() 判斷上傳的數據是否有效,有效則通過 pillow 的 Image 模塊的 open 打開上傳圖片,否則返回 HTTP_400_BAD_REQUEST

打開上傳的圖片後會產生一個副本,這個副本用來保存到項目下,也就是用戶的頭像文件。那麼就需要設計頭像的文件名,用來保存頭像的副本文件。至於如何設計每個人都不同,我的思路是每個用戶的頭像都保存到各自以用戶名為名的文件夾下,為了防止前一張頭像被覆蓋,所以用時間戳作為圖像名,然後加上客戶端回傳的後綴名就可以生成我們的圖片文件了。

定義好文件路徑後,接著通過 save() 函數保存圖片副本,還有很重要的一步就是需要把文件路徑更新到資料庫。如果是在本地測試,資料庫顯示的文件地址會是你本地項目的地址,但是當你從客戶端發出請求後,收到的會是伺服器地址,沒毛病,不要以為自己保存的路徑錯了。例如我保存的地址為 C:/ProjectsFloder/PythonProjects/expert/expert_project/media/avatar/kuky_xs/1525787433.jpg

實際在客戶端返回的地址為

http://192.168.0.103:8080/media/C%3A/ProjectsFloder/PythonProjects/expert/expert_project/media/avatar/kuky_xs/1525787433.jpg

請求信息

內容不多,但是一定要細心注意文件夾的名稱,一定要細心注意文件夾的名稱,一定要細心注意文件夾的名稱,重要的事說三遍,反正我在文件名上卡了好久,最後發現少加了一層,還是不夠仔細啊。

3

補充一下

資料庫數據

然後打開命令行 python manage.py inspectdb 然後就會根據資料庫的數據生成 model,結果如下圖所示

反向生成model

將生成的代碼複製到我們的 models 文件中,特別要注意下圈出來的部分,大功告成!

最後,附上另一個 DRF 練習項目的地址,本部分涉及的內容也在其中 簡易接單系統

https://github.com/kukyxs/expert_project

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 碼蛋 的精彩文章:

TAG:碼蛋 |