この投稿は 「Calendar for Django | Advent Calendar 2022 - Qiita」 3日目の記事です。
小ネタです。
Django のビューから直接 Djangoコマンドを実行するには、django.core.management.call_command を使えば簡単 です。*1
こんな感じで使います。
api/views.py
from django.core import management from rest_framework.response import Response from rest_framework.views import APIView class CallCommandView(APIView): def post(self, request, *args, **kwargs): # Djangoコマンドを実行 management.call_command('loaddata', 'test_data', verbosity=0) # レスポンスオブジェクトを作成して返す return Response({'success': True})
これは Django REST Framework(通称 DRF)を使用したビューの実装例ですが、Django 単体でも同じように利用することが可能です。
config/urls.py
from django.urls import path from api import views urlpatterns = [ path('call-command/', views.CallCommandView.as_view()), ]
実行結果
ちなみに、Django コマンドの「--no-input」オプションは call_command() に「interactive=False」を指定することで利用可能です。
management.call_command('flush', verbosity=0, interactive=False)
標準出力をファイルに書き込むこともできます。*2
with open('/path/to/command_output', 'w') as f: management.call_command('dumpdata', stdout=f)
cron などで定期実行している Django コマンドを、API で呼び出すなどといった利用方法が考えられますね。
*1:ビューからでなくても、モデルでもどこでも実行可能です。
*2:https://docs.djangoproject.com/ja/3.2/ref/django-admin/#output-redirection