【问题标题】:Help a Python newbie with a Django model inheritance problem帮助 Python 新手解决 Django 模型继承问题
【发布时间】:2010-05-26 15:28:33
【问题描述】:

经过多年的 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 管理页面吐出错误“Caught an exception while rendering: 'Category' object has no attribute 'name'

有人能指出正确的方向吗?

【问题讨论】:

    标签: python django django-models django-inheritance


    【解决方案1】:

    【讨论】:

    • 在文档中看到这一点让我有点震惊……这似乎是一个很大的遗漏!
    • 嗯,模型继承完全从 Django 中消失了很长一段时间,所以我认为这是一个很大的改进。我不完全确定,但我认为您可以在自定义管理器中实现您的 unique=true 。或者,您可以使用多重继承并将 UNIQUE_NAME 作为混合。
    【解决方案2】:

    你的Common 班级有一个小错误

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

    应该是

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

    【讨论】:

    • 认为这一定是复制粘贴问题,因为它不是有效的 Python - 那时还没有定义 self。
    • 对错字造成的混乱感到抱歉。因为我是 Python 新手,所以我一直在试验很多奇怪的代码,只是为了看看会发生什么,这是我的实验之一,我打算在粘贴到 Stackoverflow 之前进行清理。不幸的是,即使删除了错字,我的代码也无法正常工作
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-04
        • 2011-01-30
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        相关资源
        最近更新 更多