经过多年的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管理页面吐出错误“在渲染时捕获到异常:'类别'对象没有属性'name'
有人能指出我正确的方向吗?
答案 0 :(得分:2)
不,Django不允许这样做。
请参阅文档:http://docs.djangoproject.com/en/1.1/topics/db/models/#field-name-hiding-is-not-permitted
在其他问题中也回答过:In Django - Model Inheritance - Does it allow you to override a parent model's attribute?
答案 1 :(得分:1)
您的Common
班级中有一个小错误
class Common(model.Model):
self.name = models.CharField(max_length=255)
应该是
class Common(model.Model):
name = models.CharField(max_length=255)
答案 2 :(得分:1)
请注意,UNIQUE约束实际上与Django无关,因此您可以自由地将其添加到数据库表中。您也可以使用post-syncdb钩子来实现此目的。
答案 3 :(得分:0)
尝试使用Meta.unique_together
将其强制转换为自己的唯一索引。如果做不到这一点,最简单的方法就是创建两个独立的抽象类,一个是字段唯一而另一个不是。