こんにちは、かつコーチです。
Djangoには標準でpython manage.py shellというコマンドがありますが、実際に使ってみると「モデルを毎回importするのが面倒」と感じたことはないでしょうか。
筆者もこの手間が地味にストレスで、調べているうちにshell_plusという便利なコマンドの存在を知りました。
この記事では、django-extensionsが提供するshell_plusを使って、モデルのデータ確認やちょっとしたロジックの検証を効率化する方法を紹介します。
shell_plusとは何か
標準のshellとの違い
Django標準のshellコマンドは、Pythonの対話環境からDjangoのモデルなどを操作できる機能です。
ただし、モデルを使うには毎回自分でimport文を書く必要があります。
python manage.py shell
>>> from blog.models import Post
>>> from accounts.models import User
shell_plusは、django-extensionsというライブラリが提供する拡張コマンドで、プロジェクト内の全モデルを自動でimportした状態で対話環境を起動してくれます。
django-extensionsの導入
pip install django-extensions
settings.pyのINSTALLED_APPSに追加します。
INSTALLED_APPS = [
...
"django_extensions",
]
これだけで、shell_plusコマンドが使えるようになります。
基本の使い方
モデルをimportなしで操作する
python manage.py shell_plus
起動すると、起動時に自動importされたモデル一覧が表示されます。
# Shell Plus Model Imports
from blog.models import Post, Category
from accounts.models import User
...
あとはimport不要で、そのままモデルを操作できます。
>>> Post.objects.filter(is_published=True).count()
12
>>> Post.objects.last()
<Post: 初めてのDjango投稿>
実行されたSQLを確認する(–print-sqlオプション)
デバッグでとくに便利なのが、発行されたSQLをそのまま表示するオプションです。
python manage.py shell_plus --print-sql
>>> Post.objects.filter(category__name="Django").count()
SELECT COUNT(*) AS "__count"
FROM "blog_post"
INNER JOIN "blog_category" ON ("blog_post"."category_id" = "blog_category"."id")
WHERE "blog_category"."name" = 'Django'
Execution time: 0.001230s [Database: default]
「思ったより遅いクエリだな」と感じたとき、まずこのオプションで実際のSQLを確認する癖をつけると、N+1問題などにも早い段階で気づけるようになります。
よくあるつまずきポイント・エラー対処
shell_plusコマンドが見つからない
❌Before
$ python manage.py shell_plus
Unknown command: 'shell_plus'
Type 'manage.py help' for usage.
筆者もインストール直後にこのエラーに遭遇し、「pip installしたのに動かない」としばらく戸惑いました。
原因は、pip installしただけでINSTALLED_APPSへの追加を忘れていたことです。
✅After
# settings.py
INSTALLED_APPS = [
...
"django_extensions", # これを追加する
]
Djangoの管理コマンドは、INSTALLED_APPSに登録されたアプリの中から探索される仕組みになっています。pip install(パッケージのインストール)とINSTALLED_APPSへの登録(Djangoへの認識)は別の作業だと意識しておきましょう。
IPythonが入っていないと素っ気ない画面になる
shell_plusはIPythonがインストールされていると、補完機能や見やすい表示など、より快適な対話環境になります。
入っていない場合は標準のPythonシェル相当の表示になるだけでエラーにはなりませんが、開発体験を上げたいなら合わせてインストールしておくのがおすすめです。
pip install ipython
応用・一歩先の使い方
notebook形式でも使える
shell_plus --notebookとすると、Jupyter Notebook形式でモデルを操作できます。
グラフ化やデータの可視化を交えて調査したいときに便利です。
pip install jupyter
python manage.py shell_plus --notebook
本番データを直接触るときは慎重に
shell_plusは非常に便利な反面、本番環境で不用意に使うと、うっかりdelete()やupdate()を実行してデータを壊してしまうリスクもあります。
本番のデータ調査をする際は、まず--print-sqlで実行内容を確認したり、トランザクションを意識したりするなど、慎重な運用を心がけましょう。
まとめ
この記事のポイント
shell_plusはdjango-extensionsが提供する、モデル自動importつきの対話シェルINSTALLED_APPSへの追加を忘れるとUnknown commandエラーになる--print-sqlオプションで実行SQLを確認でき、クエリの無駄な発行に気づきやすい- 本番データを触る際はうっかり操作に注意する
次に読むべき記事
クエリの効率化についてさらに深掘りしたい方は、「N+1問題とselect_related・prefetch_relatedでの解決方法」もあわせてご覧ください。
タグ: Django, 初心者向け, エラー解決