iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0

前言

前面我們有使用 Django 與 DRF 的一些基礎功能了,但其實有些功能上不是太方便,例如 Admin 系統的設定都要自己打,獲釋每次使用 Django shell (指令 python manage.py) 等等的不方便之處,今天讓我教大家使用 django-extensions 來協助我們吧!

安裝

首先我們來安裝一下這個套件,跟之前一樣透過 poetry 進行,在終端機輸入指令

poetry add django-extensions

接著讓我們告訴 Django 我們有安裝這個套件,編輯 server/settings.py 檔案

# ...... 以上省略 ......

INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "rest_framework",
    "rest_framework_simplejwt",
    "drf_spectacular",
    "django_filters",
+   "django_extensions",
    "server.app.common",
    "server.app.todo",
]

# ...... 以下省略 ......

這樣我們就安裝完成了,接著讓我們看看起個常用的功能

自動產生 Admin 檔案內容

讓我們在終端機輸入指令(記得啟動虛擬環境)

python manage.py admin_generator todo Category

應該會看到輸出像這樣的內容

from django.contrib import admin

from .models import Category


@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')
    search_fields = ('name',)

這樣其實跟我們自己的打個很像,我們可以利用這個指令產生指定 app 的 model 的 Admin 設定檔,再做細部的修改,可以大幅度的提升我們的速度

顯示專案的 url

當專案中的路由越來越多我們會逐漸搞不清楚我們到底有哪些路由,尤其我們在使用 DRF 時都是透過 ViewSet 與 router 自動註冊出所有路徑的,而 docs 又只顯示了 API 相關的路由並不完整,所以我們可以利用 django-extensions 提供的工具讓我們看到所有的路由,我們在終端機輸入指令

python manage.py show_urls

就會看到像這樣的輸出

/admin/ django.contrib.admin.sites.index    admin:index
/admin/<app_label>/ django.contrib.admin.sites.app_index    admin:app_list

========== 中間省略 ==========

/api/token/refresh  rest_framework_simplejwt.views.TokenRefreshView
/health server.app.common.views.HealthView

這樣就可以看到 url 與 view 的對應。

Django Shell 加強版

大家之前在使用 Django Shell 時應該會發現我們大多都是用來操作資料庫的語法,那每次都要自己 import model 其實有點不方便,讓我們用加強版來加快速度吧!在終端機輸入指令

python manage.py shell_plus

應該會看到上方先出現了這段訊息

# Shell Plus Model Imports
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
from server.app.todo.models import Category, Tag, Task
# Shell Plus Django Imports
from django.core.cache import cache
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import transaction
from django.db.models import Avg, Case, Count, F, Max, Min, Prefetch, Q, Sum, When
from django.utils import timezone
from django.urls import reverse
from django.db.models import Exists, OuterRef, Subquery

接著就跟一般的 Django Shell 一樣了,但他把我們常用的 ORM 語法與 Model 都匯入進來了,可以直接使用。

另外有時候我們有時候會希望可以看到我們 ORM 語法執行後到底轉換成什麼 SQL 語法,我們可以在終端機輸入下方指令(記得先輸入 exit 回到終端機模式)

python manage.py shell_plus --print-sql

接著我們隨便輸入一個查詢

Task.objects.all()

應該會看到除了資料以外還有 SQL 指令一起出現了,這樣當我們 ORM 語法不如我們想像時就可以利用這個方式排查了。

Server 加強版

除了 shell 有加強版以外,我們 runserver 其實也有不過他會需要依賴 werkzeug 這個套件,所以我們需要安裝他一下

poetry add --group dev werkzeug

這邊把他裝在 dev 裡面是因為 runserver 指令只有在開發時才會執行,所以只需要裝在 dev 分類中即可。

接著讓我們在終端機輸入指令

python manage.py runserver_plus

這樣 runserver增強模式就啟動了,假設你在開發過程中不小心有錯誤,這個模式會提供你更多的資訊來除錯。

而且與 shell_plus 相同,如果你希望看到 runserver_plus 過程中執行了哪些 SQL 指令可以透過下方指令

python manage.py runserver_plus --print-sql

這樣在執行的過程中就可以看到 API 所下的 SQL 指令了。

總結

今天教大家怎麼使用 django-extensions 這個套件的其中一小部分,其實除了這些功能外他還提個了其他好用的功能有興趣的人可以參考一下他的文件,明天我們會講跟效能相關的東西,為了方便觀測所以大家今天要把這個套件安裝好唷~

結束前別忘了檢查一下今天的程式碼有沒有問題,並排版好喔。

ruff check --fix .
black .
pyright .

今天的內容就到這邊了,讓我們期待明天的內容吧。

P.S. 今天的檔案更新可以參考我的 Git Commit 大家可以搭配服用


上一篇
Day23 - 實作 Category 相關功能
下一篇
Day25 - Query N+1 問題
系列文
Django REST 大冒險:探索精彩紛呈的 API 開發世界30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言