はじめに
案件内でDjangoでの開発環境の構築を行った際にやっておいて良かったことを紹介しようと思います。
開発環境は下記を利用しています。
Django==3.2.5
djangorestframework==3.12.4
factory-boy==3.3.0
pytest==7.4.3
models.pyの分割
多くのテーブルを扱うとmodels.pyが肥大化します。
可読性向上を目的とし、テーブルごとにファイルを作成しました。
やり方
- models.pyは削除し、models.pyがあった場所にmodels ディレクトリを用意する
- modelsディレクトリに各テーブルのファイルを用意する
- 各テーブルのファイルの中身はmodels.pyと同じ書き方で問題ない
models/
├ __init__.py
├ user.py
└ book.py
- modelsディレクトリに
__init__.py
ファイルを用意する -
__init__.py
ファイルで各テーブルのファイルをimportする
from .user import User
from .book import Book
SQLのログを表示する
- N+1問題が発生していないか簡単に確認できるよう、発行されたSQLをログに出力するよう設定を行いました。
やり方
- settings.pyに以下を記述
# 発行されたSQLをログに出力
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"handlers": {
"console": {
"level": "DEBUG",
"class": "logging.StreamHandler",
},
},
"loggers": {
"django.db.backends": {
"handlers": ["console"],
"level": "DEBUG",
},
},
}
ログレベルや出力フォーマットのカスタムなども可能です。詳しい方法は公式ドキュメントを参照ください。
リンター・フォーマッター導入
コードの一貫性を保つために、リンター・フォーマッターを導入しました。
今回はPEP8に準拠したかったため、flake8とblackを採用しています。
やり方
以下のライブラリをインストールする
pip install flake8
pip install black
.flake8ファイルに以下記述
[flake8]
max-line-length = 88
extend-ignore = E203
// 対象外ファイルの設定。必要に応じて設定
exclude = api/migrations, api/models/__init__.py, api/views/__init__.py
-
flake8では1行の最大文字数を79文字に規定している一方で、Blackでは88文字まで許容しているため、この競合を回避するためmax-line-lengthを88に設定
-
flake8ではコロンの前に空白がある場合に警告を出す(E203)が、black は算術演算子の周りの空白を許可するため、この競合を回避するためE203を無視
pyproject.tomlに以下を記述
[tool.black]
// 対象外ファイルの設定。必要に応じて設定
exclude = '''
/(
api/migrations
| app/models/__init__.py
| api/views/__init__.py
)/
'''
コマンドの実行
flake8 --show-source {対象ディレクトリ}
例)flake8 --show-source app
black {対象ディレクトリ}
例)black app
GithubActions
GitHubのCI/CDでflake8とblackのコマンドを実行し、PR作成じとコミット時にチェックを自動的に行うようにしました。
.github/workflows/backend-ci.yml
に以下を記述
name: backend-ci
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8 black
- name: Run flake8
run: flake8 .
- name: Run black
run: black --check .
最後に
Djangoで開発を行う際にやっておいて良かったことを紹介してきました。
どれも簡単に行えるものなので、初期段階でささっと行っておくのが良さそうだと個人的に思いました。
Djangoでの開発の助けになれば幸いです。