Django で User モデルの継承について

こちらをオススメします。










以下の記事は古いです。

Django の User モデルは、そのまま継承することはできません。

この理由は User モデルは Auth というデフォルトでついているアプリ内のモデルだからです。なので、アプリ内のモデルを拡張してあげればいいのですが、もとになる機能なので直接は触らせてくれ無いと言う訳です。
 

解決策

Case 1. Django 1.4 以前の場合
→ User と OneToOneField の関係にあるモデル(ex, UserProfile)を作成する。

Case 2. Django 1.5 以降の場合
→ AbstractUser を継承させたモデルを使う。
 


Case 1. Django 1.4 以前の場合

やり方としては、
Step1. User と OneToOneField の関係にあるモデル(ex, UserProfile)を作成する。
Step2. UserProfile は User モデルが追加されたときに自動で、対になる UserProfile モデルが生成されるように設定する。
Step3. Django にわかるように AUTH_PROFILE_MODULE を設定する。
といったところでしょうか。 
自分は、1.6 を使っているので理解していません。
Storing additional information about users
Django ユーザープロファイルを作成 - cloverrose's blog
 


Case 2. Django 1.5 以降の場合

用意されている AbstractUser モデルを実装するということをしています。

Step1. 自分の Auth アプリを新しく作る。

$ python manage.py startapp corporate_auth

 

請注意
専用の認証アプリを作ったほうがきれいかなと思います。

例えば、いま hello アプリを開発していたとします。勿論、新しく Auth アプリケーションを定義しないで hello アプリ内の model.py で AbstractUser を実装することもできます。

しかし、それをした場合、新しく別のアプリ、例えば goodbye アプリを開発する際に hello アプリ内の AbstractUser を実装した Emploee モデルを import することになります。

また AbstractUser を実装した場合、admin サイトを見てください。Auth 欄から User が消えているはずです。

 

Step2. AbstractUser を実装する。

from django.contrib.auth.models import AbstractUser
class Emploee(AbstractUser):
    company= models.ForeignKey(Company,related_name='jointed_company', help_text=ugettext_lazy('所属法人'))

Extending Django’s default User
 

Step3. AUTH_USER_MODEL に AbstractUser を実装させたクラスを登録するように settings.py に書き込む

AUTH_USER_MODEL = 'corporate_auth.Emploee'

python - Django 1.6 AbstractUser m2m models validation error - Stack Overflow
 

Step4. admin サイトに登録するように corporate_auth/admin.py に書き込む

from django.contrib import admin
import corporate_auth
admin.site.register(corporate_auth.models.Emploee)

請注意
もし Group モデルを拡張しようと考えている場合は admin.site.unregister(Group) をいれてあげる必要があります。
 

Step5. 呼び出して使ってあげる。

from corporate_auth.models     import Emploee