Django升級

邁入另一個新時代

Posted by silau on September 23, 2019

之前已經將Dockerfile更新完畢,並以持續整合(英語:Continuous integration,縮寫CI)的方式放上放上GitHub及Docker Cloud,接下來就真真正正要落手將Django由1.11升級到2.0了。

由於之前在Dockerfile選用的Python版本是3.7,而不幸地Python3.7跟Django2.0 以前的版本是完全不兼容的,而且官方表明舊版本的Django只會維護安全性跟數據性的問題,所以這個不兼容情況不會納入處理。

原先打算後端的升級是可以step by step,piece by piece,逐少逐少地一邊測試一邊升級。但一來就要卡關,無辦法只好將Django的版本升上來,但一旦升級Django之後,有其他數個dependency的問題(WIKI點我)也隨之出現。那只好嘗試一個一個地處理吧。但做著做著就發現出問題的library數量太多了,而且雖然出現的衝突各有不同,但總的來說就是版本衝突,理論上只要將各個用到的library升上來最新的版本就可以了,於是一不做二不休就將所有相關library都更新到最新版本。

這大致上解決了多數的版本衝突問題,但Django仍然未能起動,仍然有數個錯誤。其中一個最主要問題是Celery跟Sentry的升級,兩者的Config方法在新舊版都有所不同,只好參照新版的寫法逐一進行改動。

其他需要處理的問題包括:

  1. The on_delete argument for ForeignKey and OneToOneField is now required in models and migrations
  2. AbstractUser.last_name max_length increased to 150 (需要執行mange.py migrate)
  3. The app_name argument to include() is removed.
  4. The is_authenticated() and is_anonymous() methods of AbstractBaseUser and AnonymousUser classes are now properties.
  5. Django REST 3.8.2 CurrentUserDefault doesn't work