帮助Python新手解决Django模型继承问题

2 投票
4 回答
679 浏览
提问于 2025-04-15 23:11

我正在做我的第一个真正的Django项目,以前一直在做PHP编程,现在遇到了模型方面的问题。首先,我发现我在模型之间复制粘贴代码,作为一个认真负责的面向对象编程(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”,并且有我想要的名称和日期。然而,我有一个“Categories”的类,其中名称必须是唯一的。我想应该有一种相对简单的方法来访问Common中的名称属性,并使其唯一。但是,我尝试的不同方法都失败了。例如:

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

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

有人能给我指个方向吗?

4 个回答

1

你的 Common 类里有一个小错误

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

应该是

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

请注意,UNIQUE约束实际上和Django没有关系,所以你可以自由地在你的数据库表中添加它。你也可以使用post-syncdb这个钩子来实现这个目的。

2

不,Django不允许这样做。

你可以查看文档了解更多信息:http://docs.djangoproject.com/en/1.1/topics/db/models/#field-name-hiding-is-not-permitted

这个问题在其他地方也有回答,比如:在Django中 - 模型继承 - 是否允许你覆盖父模型的属性?

撰写回答