Django REST FrameworkでPK(ID)以外にFKを設定する

Django REST Frameworkでは手軽にFKを設定することができますが、何も指定しないとPK(ID)に対してFKが設定されます。これをPK以外のカラムに対してFKを設定する方法です。

今回は次のような社員とその社員の所属部署を表すテーブルを考えます。

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)

class UserOrg(models.Model):
    user_org = models.CharField(max_length=100)
    is_main = models.BooleanField(default=True)
    user_id = models.ForeignKey(User, related_name='UserOrgs', on_delete=models.CASCADE)

これをマイグレーションすると次のテーブルができます。

user
id name
1 佐藤
2 鈴木
3 高橋
user_org
id user_id org_name is_main
1 1 営業部 true
2 2 開発部 true
3 3 管理部 true
4 3 経理部 false

データがあった方が分かりやすいので、適当に追加しました。
1つの部署にしか所属していない人もいれば、複数の部署に所属(兼務)している人もいますね。

こんな感じでModelにmodels.ForeignKey…と定義するとDjangoではPK(ID)に対して自動的にFKを設定してくれます。

ただ、これだとuser_orgテーブルだけ見たとき営業部に所属しているuser_idカラムが1の人って誰?ってなりますよね。
これを避けるため、次のようにUserにコードをつけておき、そのコードでFKを設定することを考えます。

user
id code name
1 sato 佐藤
2 suzuki 鈴木
3 takahashi 高橋
user_org
id user_code org_name is_main
1 sato 営業部 true
2 suzuki 開発部 true
3 takahashi 管理部 true
4 takahashi 経理部 false

こうすることで、user_orgテーブルだけ見たときに、user_codeカラムを見ればどの社員かわかりますよね。

これをDjango REST Frameworkでやりたい場合、次のようにForeignKeyに対してdb_columnとto_fieldを設定するとできます。

from django.db import models

class User(models.Model):
    code = models.CharField(max_length=100, unique=True) # FKを設定するカラムはユニークにする必要がある
    name = models.CharField(max_length=100)

class UserOrg(models.Model):
    user_org = models.CharField(max_length=100)
    is_main = models.BooleanField(default=True)
    user = models.ForeignKey(User, db_column='user_code', to_field='code', related_name='UserOrgs', on_delete=models.CASCADE) # db_columnにUserOrgのカラム名、to_fieldにFK先のカラム名を指定する

PK以外のカラムに対してFKを設定する方法でした。

コメントを残す

メールアドレスが公開されることはありません。