我想使用性能从继承模型的元类配置在越往上的抽象模型继承树所定义的字段:

class NamedModel(models.Model):
    class Meta:
        abstract = True
        verbose_name = 'object'

    name = models.CharField("Name",
        max_length=200,
        db_index=True,
        help_text="A meaningful name for this %s." % Meta.verbose_name)
        # see what I'm trying to do here?
    )
    ...

class OwnedModel(NamedModel):
    class Meta(NamedModel.Meta):
        verbose_name = 'owned object'

我想对OwnedModel形式的名称字段的帮助文本说,“这所有的对象有意义的名称”。 但它没有:“资”丢失的话,这将表明,当模型建立从NamedModel.Meta的verbose_name使用,不OwnedModel.Meta

这是不完全是我从一个角度遗产点希望:有没有办法让将要创建的领域,从而Meta.verbose_name是指在非抽象模型类,而不是抽象的一个上的值该字段被定义

还是我是愚蠢的?

(这似乎是一个简单的例子,它是:但它只是说明的东西更重要和复杂的,我试着做点)

预先非常感谢。

有帮助吗?

解决方案

我认为这是因为Meta.verbose_name被使用并且当类NamedModel被解析创建NamedModel.name。所以后来,当类OwnedModel被解析,也没有机会去改变什么。

也许你以后可以设置OwnedModel.name的help_text属性,但是这也可能改变NamedModel.name。

在类似的情况下我已经把变量部件在模型中(未元)的类属性,然后使用由运行时间的方法/属性来生成I所需要的文本。

其他提示

你为什么不设法使一类。

class BaseNamedModelMeta:
    abstract = True
    verbose_name = "your text"

然后继承和超越任何你想要的是这样的:

class OwnedModel(NamedModel):
    class Meta(BaseNamedModelMeta):
        verbose_name = 'owned object'

其实我落得这样做以下。基础模型被给出dynamic_field_definition()类方法,它可用于修补的字段,与CLS变元为正确的(继承)类。这意味着,该CLS的元属性是正确的子,而不是原始的碱。

我再用钢丝了该方法得到呼吁class_prepared信号,让你知道一切都准备好,否则

class NamedModel(models.Model):
    ...
    @classmethod
    def dynamic_field_definition(cls):
        pass

def dynamic_field_definition(sender, **kwargs):
    if issubclass(sender, NamedModel):
        sender.dynamic_field_definition()
class_prepared.connect(dynamic_field_definition)

然后,与模型类变化简单地通过该类方法重新配置(或者更可能的方法中派生类覆盖)的字段属性。

这是把OO岬至Django模型的最后一点稍微哈克的方式,但我的目的正常工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top