この投稿は 「Django Advent Calendar 2022」 23日目の記事です。
ふと、「実際の現場ではどんな Django パッケージがどれくらい使われているの?🤔」 という疑問が湧いてきたので、自分で次のようなアンケートを採ってみることにしました。
本記事では、この利用実態調査アンケートの結果発表に加えて、ちょっとした分析をしてみたいと思います。なお、本アンケートには40人の方から回答をいただくことができました。皆さま、ご協力ありがとうございました。
目次
Q1.回答者の Django 経験年数
Q1.Django の経験はどのくらいですか?
- 経験なし
- 1年未満
- 1〜3年くらい
- 3〜5年くらい
- 5年以上
回答者の Django 経験年数の分布は次のようになりました。
一番多かったグループは「1〜3年くらい」で 40%でした。なお、「1年未満」の階級値を「0.5」、「1〜3年くらい」を「2」、「3〜5年くらい」を「4」、「5年以上」を「7.5」として計算した 回答者の Django 経験年数の平均は 3.8 年 でした。
Q2.Django パッケージ利用状況
代表的な Django パッケージ 35個について、それぞれの利用状況を「聞いたことがない」「聞いたことはあるが使ったことはない」「試しに使ったことがある」「現場で使っている(過去に使っていた)」の4択でアンケートしました。
パッケージの選定にあたっては、毎年数千名が参加する Django 開発者向けアンケート「2022 Django Developers Survey」の「お気に入りのサードパーティ Django パッケージは?」という質問の選択肢をそのまま利用しました。*1
Q2.次の Django パッケージをそれぞれどのくらい利用していますか?
- 1: 聞いたことがない
- 2: 聞いたことはあるが実際に使ったことはない
- 3: 試しに使ったことがある
- 4: 現場で使っている(過去に使っていた)
Django パッケージの選択肢
- dj-database-url
- dj-rest-knox
- dj-rest-auth
- django-allauth
- django-braces
- django-celery
- django-celery-beat
- django-channels
- django-click
- django-compressor
- django-configurations
- django-cors-headers
- django-crispyforms
- django-dbbackup
- django-debug-toolbar
- django-environ
- django-extensions
- django-filter
- django-import-export
- django-lifecycle
- django-model-utils
- django-money
- django-redis
- django-rest-swagger
- django-storages
- django-silk
- django-taggit
- django-test-plus
- djangorestframework
- djangorestframework-simplejwt
- Djoser
- model-bakery
- pylint-django
- pytest-django
- Wagtail
回答結果を 4 > 3 > 2 > 1 の優先順に並べ替えた利用度ランキングがこちらになります。
3人に2人が現場で使っているという「djangorestframework」(DRF)がダントツの1位でした。 「試しに使ったことがある」を足し合わせると95%というのも衝撃の結果ですよね。「django-cors-headers」の利用度も高いことから、現場で DRF を使って API 開発をしている方が多いことが伺えます。
次点の 「django-debug-toolbar」は2人に1人くらいが現場で使っているという結果になりました。 私は開発時にはどのプロジェクトにも「django-debug-toolbar」と「django-extensions」はとりあえず入れるようにしていますが、そんな感じで「とりあえず生!🍺」みたいに使われているのかもしれません。*2
「4: 現場で使っている」「3: 試しに使ったことがある」「2: 聞いたことはある」を足し合わせたものを「認知度」とすると、認知度が高いほど、現場で使っている割合が全体的に高い傾向にありますが、認知度の割には現場で利用されていない(現場で使っていない割には認知度が高いとも解釈できる?)パッケージとして「django-allauth」「django-crispyforms」「django-channels」などが挙げられるでしょうか。
なお、「django-celery」は開発が長年停滞していて現時点で公式サポートされているバージョンの Django には対応していないようなのですが、今回のアンケートでは過去に現場で使っていたということで票が入ったのでしょう。*3
経験年数による変化
ここで Q1. とQ2. の結果を組み合わせて、少し考察をしてみたいと思います。
まず、経験年数のグループごとに「現場で使っている」と回答したパッケージ数の平均を比較してみます。
3〜5年くらいを境にして、利用しているパッケージの数が跳ね上がっている ように見えます。だいたい3年目くらいから複数の現場を経験するようになるということなのかもしれませんね。
次に、「Django 経験が長い人ほど利用度が高くなるパッケージはどれか?」を調べるために、経験年数とパッケージ利用度の相関を計算してみました。相関が高い Django パッケージランキングの上位5つを下に示します。
# | Django パッケージ | 相関係数 |
---|---|---|
1 | django-cors-headers | 0.64 |
2 | django-silk | 0.60 |
3 | django-extensions | 0.57 |
4 | django-channels | 0.55 |
5 | django-filter | 0.54 |
これらはベテランならではのニーズに答えてくれるパッケージということなのでしょうか。まだこれらのパッケージを試したことがないという方は、ぜひチェックしてみてください。
PyPI ダウンロード数のランキングとの比較
「The 10 Most-Used Django Packages | LearnDjango.com」という記事にインスパイアされ、PyPI のダウンロード数を元にした別角度での利用度ランキングを作成してみました。PyPI のダウンロード数は「Top PyPI Packages」というサービスから取得しました。
パッケージ名の右側のカッコ内の数字は先に示した「現場で使っている」ランキングの順位ですが、多少のブレはあるものの今回の結果と比較して違和感のない結果になっている印象です。
直近のダウンロード数を元にしていることで、プロジェクトがすでにアーカイブ済みになっている「django-rest-swagger」のダウンロード数が少なかったり、開発が長年停滞している「django-celery」などのパッケージがランキング外になっていたりするのは、まさに現時点での「利用実態」を表していると言えるでしょう。
GitHub スター数のランキングとの比較
次に、12/14 時点の GitHub スター数で並べた人気ランキングを見てみます。
同じく、カッコ内の数字は先に示した「現場で使っている」ランキングの順位ですが、(PyPI のダウンロード数ランキングと比べて)少し乖離が大きいような感じがします。
例えば、上位にランクインしている「Wagtail」は8年以上、「django-allauth」は12年以上も継続しているリポジトリということでスター数が多くなっている可能性がありますし、「django-channels」は Django の公式コミュニティが開発しているということで注目度が高いためにスター数が多くなっている可能性があります。また、現在のスター数は多いけれども実際はもう使われなくなってしまったリポジトリもあったりするので、実際の利用実態と乖離していることもあるでしょう。
ということで、パッケージを選定する際には、GitHub スター数を「人気度」として参考にしつつ、PyPI の直近のダウンロード数を「利用度」として判断材料にする のがよいのではないでしょうか。なお、実際の選定にあたっては次の点も留意するのがよいでしょう。
- 開発が停滞していないか(直近の PyPI ダウンロード数である程度把握できる)
- Issue が放置されていないか
- 公式ドキュメントが充実していること
- コントリビュータが数人以上いること(ぼっち開発は危険)
まとめ
独自のアンケートを採って、「実際の現場ではどんな Django パッケージがどれくらい使われているのか?」を調査しました。
「Q2.Django パッケージ利用状況」の結果のグラフを見ると、特異的に認知度が高いものがいくつかあったものの、全体的に、認知度が高いほど現場で利用されている度合いが高い傾向にあることが分かりました。結果としては、「djangorestframework」が認知度・利用度ともダントツのトップでした。
今回は、私が全然知らなかった Django パッケージも含めてアンケートをすることができたので、大変興味深く調査することができました。アンケートにご協力いただいた皆さま、誠にありがとうございました。改めて御礼申し上げます。
参考までに、アンケート結果の可視化に利用したコードは ↓ にアップしています。
(おまけ)ChatGPT による Django パッケージの説明
今回のアンケートの選択肢として挙げたそれぞれの Django パッケージの説明文を載せておきます。ちなみにこの説明文は、最近話題の「ChatGPT」の回答を使わせていただきました。ざっとチェックしましたが、しれっと大嘘をついている可能性があるかもしれませんのでご注意ください。
Django パッケージ | 説明文 |
---|---|
djangorestframework | Django フレームワークで RESTful な Web API を作成するためのライブラリです。このライブラリを使用することで、Django アプリケーションを通じて RESTful な Web API を提供することができます。 djangorestframework には、API のエンドポイントやリクエストとレスポンスのシリアライザ、API の認証や権限管理など、RESTful な Web API を実装するための必要な機能がすべて提供されています。このライブラリを使用することで、Django アプリケーションから RESTful な Web API を提供することができるようになります。 |
django-debug-toolbar | Django にて、開発時にデバッグを行うためのものです。このパッケージを使用することで、Django アプリケーションの開発時に、リクエストやレスポンスなどの詳細情報を表示することができます。 |
django-filter | Django アプリケーションでクエリセットをフィルタリングするためのライブラリです。このライブラリを使用することで、クエリセットを簡単に様々な条件でフィルタリングし、特定の条件にマッチするデータのみを取得することができます。 django-filter を使用することで、データベースからデータを抽出する際に、より細かいフィルタリングを行うことができるため、データをより正確かつ効率的に取得することができます。 |
django-storages | Django フレームワークでさまざまなクラウドストレージサービスを使用するためのライブラリです。このライブラリを使用することで、Django アプリケーションで Amazon S3 や Google Cloud Storage などのクラウドストレージサービスを簡単に使用することができます。 django-storages を使用することで、Django アプリケーションで保存されるデータや画像などのファイルをクラウドストレージ上に保存することができます。これにより、アプリケーションのデータを安全かつスケーラブルな方法で保存することができるようになります。 |
django-cors-headers | Django にて、クロスオリジンリソースシェアリング(CORS)を扱うためのものです。CORS は、異なるオリジン(ドメイン)間での Web ページのやり取りを許可する仕組みです。 |
django-extensions | Django フレームワークのためのサポートライブラリです。このライブラリには、Django アプリケーションを開発するためのさまざまな便利な機能が含まれています。例えば、コマンドラインから Django プロジェクトを作成するためのツール、データベースのスキーマを表示するためのツール、データベースのデータをダンプするためのツールなどがあります。このライブラリを使用することで、Django アプリケーションの開発プロセスをよりスムーズかつ効率的に行うことができます。 |
django-environ | Django アプリケーションで環境変数を簡単に使用できるようにするためのライブラリです。このライブラリを使用することで、アプリケーションの設定値を環境変数から取得することができます。これにより、アプリケーションの設定値を外部から安全かつ簡単に管理することができます。 |
pytest-django | Python のテストフレームワークである pytest を用いて Django Web アプリケーションのテストを実行するためのプラグインです。このプラグインを使うことで、Django アプリケーションのテストを簡単に実行し、結果を比較することができます。また、pytest-django は、Django アプリケーションのデータベースを自動的にセットアップ・クリーンアップするため、データベースのテストも容易に行うことができます。 |
django-import-export | Djangoフレームワークでのデータのインポートおよびエクスポートを簡単に行うためのライブラリです。このライブラリを使用することで、Djangoのモデルデータを様々な形式のファイル(CSV、JSON、Excelなど)とやりとりすることができます。django-import-export を使用することで、データのインポートおよびエクスポート操作を管理画面から直接実行することができます。 |
django-allauth | Django にて、多要素認証を提供するためのものです。このパッケージを使用することで、Django アプリケーションで簡単に多要素認証を実装することができます。また、django-allauth は Django のログイン認証システムを拡張しており、既存の Django アプリケーションでも簡単に導入することができます。また、django-allauth は様々な外部サービス(Facebook、Google、Twitter など)との連携もサポートしています。 |
djangorestframework-simplejwt | django-rest-framework を使用した RESTful な Web API にJSON Web Tokens(JWT)を使用した認証を実装するためのライブラリです。JWT は、トークンベースの認証方式の一種です。djangorestframework-simplejwt を使用することで、django-rest-framework で作成した RESTful な Web API に JWT を使用した認証を実装することができます。これにより、API を利用するアプリケーションがAPIに対してアクセスする際に、トークンを使用して認証を行うことができるようになります。 |
django-redis | Django フレームワークで Redis を使用するためのライブラリです。Redis は、速度が非常に速いキー/値型のデータベースです。django-redis を使用することで、Django アプリケーションで Redis を使用してデータを保存することができます。これにより、Djangoアプリケーションのデータ保存や取得が高速化されます。また、django-redis は、Django のキャッシュフレームワークと組み合わせて使用することで、アプリケーションのパフォーマンスをさらに向上させることができます。 |
django-celery | Web フレームワークである Django と、Python のタスク駆動フレームワークである Celery を組み合わせるためのものです。このパッケージを使用することで、Django アプリケーション内で Celery を利用して、非同期タスクを管理することができます。 |
dj-database-url | Django を使用したアプリケーションで、データベースの接続文字列を簡単に扱うためのライブラリです。このライブラリを使うことで、データベースの接続情報を環境変数や設定ファイルから読み取り、Django の設定に渡すことができます。その結果、Django アプリケーションのデプロイやテストを容易に行うことができるようになります。また、dj-database-url は、様々なデータベース管理システムをサポートしているため、どのようなデータベースを使用しているかに関係なく利用できます。 |
django-silk | Django フレームワークでリクエストとレスポンスをモニタリングするためのライブラリです。このライブラリを使用することで、Djangoアプリケーションで発生するHTTPリクエストとレスポンスを管理画面から簡単に閲覧することができます。django-silkを使用することで、アプリケーションのパフォーマンスやエラーを把握することができるため、デバッグやトラブルシューティングがより容易に行えます。また、django-silkは、リクエストとレスポンスの中身を表示するだけでなく、リクエストを再現したり、リクエストやレスポンスを検索したりすることができます。 |
django-model-utils | Django フレームワークでモデルを定義する際に便利なユーティリティクラスを提供するライブラリです。このライブラリを使用することで、モデルの作成やカスタマイズがより簡単かつ効率的に行えます。 |
django-crispyforms | このパッケージを使用することで、Django アプリケーションで簡単にフォームを美しくレンダリングすることができます。また、django-crispy-forms は Bootstrap を使用したフォームのレンダリングをサポートしています。 |
django-rest-swagger | Django フレームワークで作成された RESTful API に Swagger を組み込むためのライブラリです。Swagger は、RESTful API を文書化して公開するためのツールです。django-rest-swagger を使用することで、Django アプリケーションで作成した RESTful API を Swagger を使用して文書化することができます。これにより、API を使用する開発者が API の仕様や使用方法を簡単に理解することができるようになります。また、django-rest-swagger を使用することで、API のテストやモックを作成することができます。 |
dj-rest-auth | Django の REST フレームワークである Django REST framework にて、ユーザー認証を提供するためのものです。このパッケージを使用することで、Django アプリケーションで簡単にユーザー認証を実装することができます。また、dj-rest-auth は Django のログイン認証システムを拡張しているため、既存の Django アプリケーションでも簡単に導入することができます。 |
Wagtail | Wagtail は、Django フレームワークを使用した CMS(Content Management System)です。このCMSを使用することで、WebサイトやWebアプリケーションのコンテンツの管理をより簡単かつスムーズに行うことができます。 Wagtail には、ページやブログ記事の管理、メディアライブラリ、ページのテンプレートやカスタマイズ、検索、ユーザー管理などの機能が備わっています。これらの機能を使用することで、WebサイトやWebアプリケーションのコンテンツを効率的に管理することができます。また、Wagtail はオープンソースであるため、カスタマイズや拡張も容易に行うことができます。 |
django-compressor | Django にて、JavaScript や CSS のファイルを圧縮するためのものです。このパッケージを使用することで、Django アプリケーションで簡単に JavaScript や CSS のファイルを圧縮することができます。 |
Djoser | Django フレームワークで作成された RESTful な Web API にユーザー管理機能を実装するためのライブラリです。このライブラリを使用することで、Djangoアプリケーションにユーザー登録、ユーザー情報の管理、パスワードの変更などの機能を簡単に実装することができます。また、Djoser は、JSON Web Tokens(JWT)を使用した認証をサポートしているため、JWT を使用した API の認証も実装することができます。Djoser を使用することで、Django アプリケーションにRESTful な API を作成し、ユーザー管理や認証を実装することができるようになります。 |
django-channels | Django にて、WebSocket や Server-Sent Events(SSE)を扱うためのものです。このパッケージを使用することで、Django アプリケーションで WebSocket や SSE を利用した通信を実装することができます。 |
django-celery-beat | Django フレームワークと Celery というタスクキューライブラリを組み合わせて使用するためのツールを提供します。Celery は、バックグラウンドで処理を行うタスクを管理するためのライブラリです。django-celery-beat を使うことで、Django プロジェクトで Celery のスケジュール処理をより簡単に利用することができます。また、django-celery-beat には、Django のデータベースを使って Celery のスケジュールを管理するためのツールが提供されているため、Django プロジェクトで定期的なタスクを実行するためのインフラストラクチャを構築することができます。 |
django-taggit | Django フレームワークでタグを扱うためのライブラリです。このライブラリを使用することで、Djangoアプリケーションでタグを作成したり、タグを付けられたオブジェクトを取得したりすることができます。django-taggit を使用することで、アプリケーションにタグ付け機能を簡単に実装することができます。また、django-taggit は、既存の Django モデルにタグを追加することもできます。これにより、タグを使用してデータを管理したり、検索したりすることができます。 |
model-bakery | Django プロジェクトで使用されるモデルを生成するための Python パッケージです。model-bakery は、モデルを生成し、操作し、評価するためのツールを提供します。 |
django-dbbackup | このパッケージを使用することで、Django アプリケーションで簡単にデータベースのバックアップを管理することができます。また、django-dbbackup は様々なクラウドストレージサービス(Amazon S3、Dropbox、Google Cloud Storage など)との連携もサポートしています。 |
pylint-django | pylint-django は、Django フレームワークで作成された Python コードを検証するための Pylint プラグインです。Pylint は、Python のコード品質を測定するツールです。pylint-django を使用することで、Django フレームワークを使用した Python コードに対して、Pylint が提供する様々な品質指標を適用することができます。これにより、Django フレームワークを使用した Python コードの品質を向上させることができます。また、pylint-django は、Django フレームワーク固有の構文や API を理解しており、Django フレームワークを使用した Python コードをより正確かつ効率的に検証することができます。 |
django-braces | Django にて、様々な拡張機能を提供するためのものです。このパッケージを使用することで、Django アプリケーションで簡単にビューやミックスインなどの拡張機能を実装することができます。また、django-braces は他の Django パッケージとも組み合わせて使用することができ、Django プロジェクトで様々な拡張機能を組み合わせることができます。 |
django-configurations | Django にて、複数の環境に対応した設定を管理するためのものです。このパッケージを使用することで、Django アプリケーションで簡単に複数の環境(開発環境、本番環境、ステージング環境など)に対応した設定を管理することができます。 |
django-click | Python の Webフレームワークである Django を使用したアプリケーションで、コマンドラインインターフェース(CLI)を簡単に構築するためのライブラリです。その結果、Django アプリケーションの管理や操作を、より便利でスムーズに行うことができるようになります。 |
django-test-plus | Django フレームワークでのユニットテストを実行するためのライブラリです。このライブラリを使用することで、Django アプリケーションのユニットテストをより簡単かつ効率的に行うことができます。 django-test-plus には、ユニットテストを実行する際に便利なユーティリティ関数やアサーションが含まれています。例えば、ビューやURLのテストを行うためのヘルパー関数、フォームやモデルのテストを行うためのアサーションなどがあります。これらの機能を使用することで、Djangoアプリケーションのユニットテストをよりスムーズかつ効率的に実行することができます。 |
django-money | Djangoフレームワークで組み込みの「Money」フィールドを提供するライブラリです。このライブラリを使用することで、データベース内での金額を貨幣単位を考慮した形で保存することができます。django-money を使用することで、金額を扱うアプリケーションを作成する際に、正確かつ柔軟な金額処理が行えるようになります。また、django-money は、様々な通貨をサポートしており、通貨の相互変換も可能です。 |
dj-rest-knox | Django の REST フレームワークである Django REST framework にて、トークンベースの認証を提供するためのものです。このパッケージを使用することで、Django アプリケーションでトークンベースの認証を実装することができます。また、dj-rest-knox は Django REST framework の上に構築されており、Django のログイン認証システムを使用している場合は、すぐに使用することができます。 |
django-lifecycle | Python の Web フレームワークである Django を使用したアプリケーションで、モデルの作成や更新時に実行される処理を定義するためのライブラリです。このライブラリを使うことで、Django のモデルを作成、更新する際に、特定の処理を自動的に実行することができます。例えば、モデルが作成されるときに、特定のメールを送信する処理や、モデルが更新されるときに、特定のログを記録する処理などを定義することができます。これにより、Django アプリケーションの動作をより自動化し、処理の追加や変更を容易に行うことができるようになります。 |
宣伝
Django の技術同人誌をこれまでに4冊出しました。開発のお供にどうぞ。
現場で使える Django の教科書《基礎編》
「現場で使える Django の教科書」シリーズ第1弾となる Django の技術同人誌。Django を現場で使うための基礎知識やベストプラクティスについて、初心者・初級者向けに解説した本です。B5・本文192ページ。Django 3.2 LTS に対応。
★ Amazon(電子版/ペーパーバック)
★ BOOTH(紙の本)
現場で使える Django の教科書《実践編》
《基礎編》の続編にあたる「現場で使える Django の教科書」シリーズの第2弾。認証まわり、ファイルアップロード、ユニットテスト、デプロイ、セキュリティ、高速化など、さらに実践的な内容に踏み込んでいます。現場で Django を本格的に活用したい、あるいはすでに活用している方にピッタリの一冊。B5・本文180ページ。
★ Amazon(電子版/ペーパーバック)
★ BOOTH(紙の本)※在庫なし
現場で使える Django REST Framework の教科書
Django で REST API を構築する際の鉄板ライブラリである「Django REST Framework」(通称「DRF」)にフォーカスした、「現場で使える Django の教科書」シリーズの第3弾。B5・本文228ページ。Django 3.2 LTS に対応。
★ Amazon(電子版/ペーパーバック)
★ BOOTH(紙の本)※在庫なし
現場で使える Django 管理サイトのつくり方
Django の管理サイト(Django Admin)だけに特化した、ニッチでオンリーワンな一冊。管理サイトをカスタマイズする前に絶対に読んでほしい本です。B5・本文152ページ。
★ Amazon(電子版)
★ BOOTH(紙の本)
*1:そもそもなぜこの35個が選ばれたのかというのは分かりませんでした。。orz
*2:私は飲めませんが。。
*3:Django 2.2 未対応 という致命的な問題があるため、「django-celery-results」や「django-celery-beat」が代替となっているようです。