設定
Django Debug Toolbar
これは便利で必須。
<body>
がないと表示されないのに注意。
View
基本はクラスベースビューで。
Form
- formset: 普通のフォーム
- modelformset: モデルに紐づいたフォーム
- inlineformset: 親と子複数をまとめて扱いたいとき
FormPreviewは使わない方がいい
formtoolsは元々はDjangoにあったが、コア機能としてあるのがふさわしくないということで、外されることになった。
特にFormPreviewは使わない方がいいと思う。
ModelForm
- ラベルだけ変更したい: label_for_instanceを定義する
Model
モデルのnullとblank
これを自分の経験と合わせると次のような感じかなと。
blank | null | 使う場面 |
---|---|---|
False | False | 必須項目 |
True | True | 任意項目で、nullである意味があるもの |
True | False | 任意項目で、nullである意味がないもの |
False | True | なし(使わない) |
任意項目について説明すると、例えばURLのクエリパラメータは
https://example.com/?foo=
と、 https://example.com/
のように、
「キーがセットされていない」と、「キーが空である」は明示的に区別されます。
これを区別しないといけないものは、blank=True, null=Trueにします。 しかしそれ以外の場合、具体的には「入力なし=空文字列として問題がない」場合は、 blank=True, null=Falseとするといいです(defaultも設定するといいかも)。
DB的にはnullは悪です。せいぜい必要悪です。 なのでnull=Trueとするのは慎重にした方がいいです。
Modelのクラス階層
- django.db.models
- django.db.models.fields
__init__.py
- Field
- RegisterLookupMixinを継承している。
- BooleanField
- その他基本的なモデルのフィールドの定義が格納されている。
- Field
- django.db.models.fields.files: ファイル関連
- django.db.models.fields.related: ForeignKey, OneToOneField, ManyToManyField
- django.db.models.functions: SQLの関数
- django.db.models.sql: SQL関連(サブクエリとか)
- django.db.models.fields
N+1問題
基本的には次の2つで解消できる。
- 外部キーで結合している場合: select_related
- 逆参照の場合: prefetch_related
テストで検知するときはこんな感じで。
認証認可
この記事に書いている通りで良さげ。
公式サイト
外部サイト
- Django Class-Based-View Inspector -- Classy CBV
- Django REST Framework 3.9 -- Classy DRF
- DjangoCongress JP 2021