Django では model から migration したテーブルを見るとカラムが model の定義順に並んでいないことがあります。
テーブル定義書があるならその順番になっていて欲しいし、データを確認する上でもカラムの並び順は大切です。
Django ではカラムの並び順を任意の順番にすることできません。設計、実装時にはそれを踏まえてあらかじめ検討する必要があるので注意が必要です。
カラムの順番
以下優先順でカラムの順番が決まるようです。
- 外部キー (FK)
外部キーは優先して最後になるようです。
migration で作られたファイルをみると、テーブルを作ったあとに外部キーフィールドを追加するようなイメージです。 - 継承元フィールド
model を継承して作成したとき継承元のフィールドは先頭に来ます。
各テーブルの共通フィールドを継承元で定義した場合は先頭に来るので注意が必要です。
対策としては、
・受け入れる
・継承元での定義をやめる
になります。実装がきれいになるのが前者で実テーブルがきれいになるのが後者可と思います。
個人的には前者にしたい気持ちが強いですが、結局はデータを見たときにストレスを感じたため後者にすることが多いです。 - 定義順
例
以下モデルを例にして説明します。
# models.py
from django.db import models
class BaseModel(models.Model):
update_at = models.DateTimeField(blank=False, null=False, auto_not_add=True)
class Meta:
abstract = True
class Sample(BaseModel):
id = models.BigAutoField(primary_key=True, blank=False, null=False)
name = models.CharField(max_length=100, blank=False, null=False)
child = model.ForeignKey(
"child", on_delete=models.SET_NULL, related_name="sample_child_id", blank=True, null=True,
)
order = models.IntegerField(blank=False, null=False)
この model で migration したとき、作られる sample テーブルのカラムは以下の順番になります。
- update_at (継承元)
- id
- name
- order
- child (FK)