2

经过多年的 PHP 编程,我正在开发我的第一个真正的 Django 项目,但我的模型遇到了问题。首先,我注意到我在模型之间复制和粘贴代码,作为一个勤奋的 OO 程序员,我决定创建一个其他模型可以继承的父类:

class Common(model.Model):
    name = models.CharField(max_length=255)
    date_created  = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.name

    class Meta:
        abstract=True

到现在为止还挺好。现在我所有的其他模型都扩展了“Common”,并有我想要的名称和日期。但是,我有一个“类别”类,名称必须是唯一的。我认为应该有一种相对简单的方法可以让我从 Common 访问 name 属性并使其独一无二。但是,我尝试使用的不同方法都失败了。例如:

class Category(Common):
    def __init__(self, *args, **kwargs):
        self.name.unique=True

导致 Django 管理页面吐出错误“渲染时捕获异常:'Category'对象没有属性'name'

有人可以指出我正确的方向吗?

4

4 回答 4

2

不,Django 不允许这样做。

请参阅文档:http ://docs.djangoproject.com/en/1.1/topics/db/models/#field-name-hiding-is-not-permitted

还回答了其他问题,例如:在 Django - 模型继承 - 它是否允许您覆盖父模型的属性?

于 2010-05-26T16:40:19.340 回答
1

你在Common课堂上犯了一个小错误

class Common(model.Model):
    self.name = models.CharField(max_length=255) 

应该

class Common(model.Model):
    name = models.CharField(max_length=255)
于 2010-05-26T15:38:36.133 回答
1

请注意,UNIQUE 约束实际上与 Django 无关,因此您可以随意将其添加到数据库表中。您也可以为此目的使用post-syncdb挂钩。

于 2010-05-26T23:11:05.757 回答
0

尝试使用Meta.unique_together强制它进入自己的唯一索引。如果做不到这一点,创建两个单独的抽象类可能是最简单的,一个具有唯一的字段,一个没有。

于 2010-05-26T16:45:15.213 回答