Django模型:子类化方法?

时间:2010-10-04 23:40:44

标签: django django-models

派,

我正在寻找一些子类化方法的验证。我有以下内容:

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()

对这个问题的开放性表示道歉 - 这可能是一个大声思考的机会。

1 个答案:

答案 0 :(得分:2)

首先,您的模型有两个奇怪之处:<​​/ p>

1)为什么是人 - =&gt;用户是ForeignKey而不是OneToOne?用户可能不止一个人?

2)用户已经拥有名字和姓氏 - 为什么还要将其分配给人?

接下来,在最终目标是最终描述的授权的范围内,为什么不只是使用权限?那么你将不需要布尔字段或尝试 - 除了最后。

从根本上说,我认为继承User模型并没有错。 #django中的人经常为此而战,但如果做得好,这是你第一次坐下来进行新的django项目时可以采取的最节省时间和最有效的步骤之一。

使用不同的属性和不同的方法添加User的不同子类可以非常快速地为您提供具有巨大auth可能性的强大用户环境。但是,到目前为止,看起来你没有做过任何需要你继承User的事情。