【问题标题】:Model subclass: override CharField max_length模型子类:覆盖 CharField max_length
【发布时间】:2015-01-28 15:45:54
【问题描述】:

我有一个提供的数据库架构,我想为其创建一个 Django 应用程序。架构中的许多表共享一组公共列,例如namedate_created。这促使我创建了一个包含这些列的抽象 Standard_model 类,并从中继承相关模型。

不幸的是,有些表有一个 name 列和一个不同的 max_length。我试图想出一种方法让子类模型将max_length 值传递给抽象基类,但我画的是空白。

有什么想法吗?

class Standard_model(models.Model):
    name = models.CharField(max_length=50)
    date_created = models.DateTimeField()

    class Meta:
        abstract = True

class MyModel(Standard_model):
    name = models.CharField(max_length=80)  # Can't do this.

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    不,你cannot override the name field definition

    在正常的 Python 类继承中,允许子类继承 类来覆盖父类的任何属性。在 Django 中,这 不允许作为 Field 实例的属性(至少, 现在不行)。如果基类有一个名为 author 的字段,你 不能在任何类中创建另一个名为 author 的模型字段 继承自该基类。

    另见:

    而且,仅供参考,根据model naming convention,它应该被称为StandardModel

    【讨论】:

    • 我已经有了 - 抱歉,我认为这很清楚。我将编辑代码示例以使其更清晰。
    • 我也很好奇这个。我不认为这是可能的,现在我确定在你的编辑之后。但在上面的例子中,并不重要。只需将两个长度都设为 80。
    • @dan-klasson 是的,但问题是name 字段的max_length 值可能有多个模型。解决方案是将其从 StandardModel 中删除,并在每个需要它的类中进行定义。
    • 是的,或者只是将不同模型的所有字段设为最大字段。除非你有数百万行,否则它并不重要。
    猜你喜欢
    • 2018-07-27
    • 2020-09-05
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    相关资源
    最近更新 更多