【发布时间】:2009-11-25 12:18:20
【问题描述】:
希望这一切都有意义:) 如有必要,我将通过 cmets 进行澄清。另外,我正在尝试在这个问题中使用粗体文本,如果我(或你)发现它分散注意力,我会将其编辑掉。就这样吧……
使用 django.contrib.auth 为我们提供了用户和组,以及其他我不能没有的有用的东西(比如基本消息传递)。
在我的应用中,我有几种不同类型的用户。一个用户只能是一种类型。这很容易由小组处理,但需要格外小心。 但是,这些不同的用户在层次结构/关系中相互关联。
让我们来看看这些用户:-
委托人 - “顶级”用户
管理员 - 每个管理员向一个校长报告
协调员 - 每个协调员向管理员报告
除了这些还有其他不直接相关的用户类型,但以后可能会相关。例如,“公司”是另一种类型的用户,可以有各种“产品”,产品可能由“协调者”监管。 “买家”是另一种可能购买产品的用户。
现在,所有这些用户都有各种其他属性,其中一些对所有类型的用户都是通用的,而另一些则只对一种用户类型不同。例如,所有类型的用户都必须有一个地址。另一方面,只有 Principal 用户属于“BranchOffice”。
上面提到的另一点是,用户只能是一种类型。
该应用程序还需要跟踪谁创建和/或修改了委托人、管理员、协调员、公司、产品等。 (这是指向 User 模型的另外两个链接。)
在这种情况下,使用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 确实在幕后使用一对一的关系来进行多表继承。我只是没有足够的资格来决定哪种方法更合理。
【问题讨论】:
标签: django inheritance multi-table