これがすべて理にかなっていることを願っています:)必要に応じてコメントで明確にします。また、私はこの質問で太字のテキストを使用して実験しており、私(またはあなた)が気が散る場合はそれを編集します。それが邪魔にならないように...
django.contrib.authを使用すると、ユーザーとグループが提供されます。基本的なメッセージングなど、これなしでは実行できない便利な機能もあります。
私のアプリには、いくつかの異なるタイプのユーザーがいます。ユーザーは1つのタイプのみになります。それは、少し特別な注意を払えば、グループによって簡単に処理されます。ただし、これらの異なるユーザーは、階層/関係で相互に関連しています。
これらのユーザーを見てみましょう:-
プリンシパル-「トップレベル」ユーザー
管理者-各管理者はプリンシパルに報告します
コーディネーター-各コーディネーターは管理者に報告します
これらとは別に、直接関連していないが、後で関連する可能性のある他のユーザータイプがあります。たとえば、「会社」は別のタイプのユーザーであり、さまざまな「製品」を持つことができ、製品は「コーディネーター」によって監督される場合があります。「バイヤー」は、製品を購入する可能性のある別の種類のユーザーです。
現在、これらすべてのユーザーには他のさまざまな属性があり、その一部はすべてのタイプのユーザーに共通であり、一部は1つのユーザータイプにのみ固有です。たとえば、すべてのタイプのユーザーはアドレスを持っている必要があります。一方、「BranchOffice」に属するのはプリンシパルユーザーのみです。
上で述べたもう1つのポイントは、ユーザーは1つのタイプにしかなれません。
アプリは、プリンシパル、管理者、コーディネーター、会社、製品などを誰が作成および/または変更したかを追跡する必要もあります。(つまり、ユーザーモデルへのリンクがあと2つあります。)
このシナリオでは、Djangoのマルチテーブル継承を次のように使用することをお勧めします。
from django.contrib.auth.models import User
class Principal(User):
#
#
#
branchoffice = models.ForeignKey(BranchOffice)
landline = models.CharField(blank=True, max_length=20)
mobile = models.CharField(blank=True, max_length=20)
created_by = models.ForeignKey(User, editable=False, blank=True, related_name="principalcreator")
modified_by = models.ForeignKey(User, editable=False, blank=True, related_name="principalmodifier")
#
#
#
または、このように実行する必要があります:-
class Principal(models.Model):
#
#
#
user = models.OneToOneField(User, blank=True)
branchoffice = models.ForeignKey(BranchOffice)
landline = models.CharField(blank=True, max_length=20)
mobile = models.CharField(blank=True, max_length=20)
created_by = models.ForeignKey(User, editable=False, blank=True, related_name="principalcreator")
modified_by = models.ForeignKey(User, editable=False, blank=True, related_name="principalmodifier")
#
#
#
外部キーを介して関連する他のユーザータイプがあることに注意してください。例:-
class Administrator(models.Model):
#
#
#
principal = models.ForeignKey(Principal, help_text="The supervising principal for this Administrator")
user = models.OneToOneField(User, blank=True)
province = models.ForeignKey( Province)
landline = models.CharField(blank=True, max_length=20)
mobile = models.CharField(blank=True, max_length=20)
created_by = models.ForeignKey(User, editable=False, blank=True, related_name="administratorcreator")
modified_by = models.ForeignKey(User, editable=False, blank=True, related_name="administratormodifier")
Djangoは、舞台裏でマルチテーブル継承に1対1の関係を使用していることを認識しています。私はどちらがより健全なアプローチであるかを決定するのに十分な資格がありません。