db_column
modelの定義する際に、指定できるフィールドオプションで、カラムの名前を設定することができる。
結論、便利だと思い使ってみたのだが、推奨されていないようで、トラップがあったのでメモ。
https://docs.djangoproject.com/en/3.2/ref/models/fields/#db-column
https://docs.djangoproject.com/en/3.2/ref/models/fields/#database-representation
db_columnの使いどころ
Djangoでは、ForeignKeyを定義した場合、自動的にカラムの名前がテーブル名_id
に指定されてしまう。
class Status(Model):
name = TextField(primary_key=True)
class User(Model):
id = UUIDField(primary_key=True)
status = ForeignKey(Status)
name = TextField()
例えば、このようなモデルを定義したとすると、Userのstatusカラムは自動でstatus_id
という名前になってしまう。
実際には、idではないのでstatus_name
というカラム名にしたい場合に、db_columnオプションを使うことができる。
そこで、db_columnを使うとカラム名を変更できる
class User(Model):
id = UUIDField(primary_key=True)
status = ForeignKey(Status, db_column='status_name')
name = TextField()
トラップ
db_columnを使用して、modelを作成したあと、objectをcreateしようとしたタイミングで違和感に気づいた。
User.objects.create(
id = '000000-00000-00000',
status_name = 'active',
name = 'john'
)
↑では、例外が発生してcreateできなかった。
試しに、
User.objects.create(
id = '000000-00000-00000',
status_id = 'active',
name = 'john'
)
↑では、問題なくcreateすることができた。
まとめ
フレームワークの裏側では、テーブル名_id
で処理するから、推奨されていない?
どうしてもカラム名を指定したい場合は、カスタムSQLで直接定義する方法でとのこと。