2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Djangoのdb_columnについて

Posted at

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に指定されてしまう。

models.py
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を使うとカラム名を変更できる

models.py
class User(Model):
    id = UUIDField(primary_key=True)
    status = ForeignKey(Status, db_column='status_name')
    name = TextField()

トラップ

db_columnを使用して、modelを作成したあと、objectをcreateしようとしたタイミングで違和感に気づいた。

create
User.objects.create(
    id = '000000-00000-00000',
    status_name = 'active',
    name = 'john'
)

↑では、例外が発生してcreateできなかった。

試しに、

create
User.objects.create(
    id = '000000-00000-00000',
    status_id = 'active',
    name = 'john'
)

↑では、問題なくcreateすることができた。

まとめ

フレームワークの裏側では、テーブル名_idで処理するから、推奨されていない?
どうしてもカラム名を指定したい場合は、カスタムSQLで直接定義する方法でとのこと。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?