派,
我正在寻找一些子类化方法的验证。我有以下内容:
class Person(models.Model):
"""
Basic person
"""
user = models.ForeignKey(User) # hide
first_name = models.CharField(max_length=200)
last_name = models.CharField(blank=True, max_length=200)
class Meta:
verbose_name_plural = "People"
def __unicode__(self):
return u"%s, (%s)" % (self.first_name, self.user)
class Contributor(Person):
"""
Contributor
A Core contributor of the site content workflow
"""
class Meta:
verbose_name = 'contributor'
verbose_name_plural = 'contributors'
def get_articles(self):
"""
Return the articles that the author has published.
"""
return Article.objects.filter(self_in=authors)
class Member(Person):
"""
Member
A Member of the website.
"""
# Member history, payments etc...
joined = models.DateTimeField()
因此,每个会员或贡献者都是系统内的人,但是一个人可能是“无”,一个或两个会员和贡献者,取决于他们的背景。
这种子类化方法可以很容易地执行以下操作:
#...
contributors = models.ManyToManyField(Contributor, help_text="Contributors/Authors to this article")
或
print Member.objects.all()
......当然还有子类化的常用效率,即常用字段和方法。
然而,我想知道职业选手和职业选手。做一些像
这样的事情class Person(models.Model):
"""
Person
"""
user = models.ForeignKey(User) # hide
first_name = models.CharField(max_length=200)
last_name = models.CharField(blank=True, max_length=200)
is_contributor = models.BooleanField()
is_member = models.BooleanField()
然后需要过滤
之类的东西# Assuming this is possible...
contributors = models.ManyToManyField(Person.objects.filter(is_contributor=True), help_text="Contributors/Authors to this article")
通过子类化方法,我想知道了解用户(人员),成员或贡献者的用户所面临的挑战,并且能够辨别它们之间的差异。
即。它真的很容易if person.is_contributor:
,但可能更具挑战性
try:
Contributor.objects.get(person__user_id=request.user.id)
except:
no_access()
else:
let_them_in()
对这个问题的开放性表示道歉 - 这可能是一个大声思考的机会。
答案 0 :(得分:2)
首先,您的模型有两个奇怪之处:</ p>
1)为什么是人 - =&gt;用户是ForeignKey而不是OneToOne?用户可能不止一个人?
2)用户已经拥有名字和姓氏 - 为什么还要将其分配给人?
接下来,在最终目标是最终描述的授权的范围内,为什么不只是使用权限?那么你将不需要布尔字段或尝试 - 除了最后。
从根本上说,我认为继承User模型并没有错。 #django中的人经常为此而战,但如果做得好,这是你第一次坐下来进行新的django项目时可以采取的最节省时间和最有效的步骤之一。
使用不同的属性和不同的方法添加User的不同子类可以非常快速地为您提供具有巨大auth可能性的强大用户环境。但是,到目前为止,看起来你没有做过任何需要你继承User的事情。