如何在Django子类中更改max_length?

1 投票
1 回答
735 浏览
提问于 2025-04-15 17:11

我在Django中有一个模型:

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

还有这个模型的子类:

class Thingy(Node):
    name       = models.CharField(max_length=100)
    otherstuff = models.CharField(max_length=255)

这个设置的问题是,虽然一切都能正常工作,但查看数据库时会发现,syncdb创建了两个表。一个叫做 appname_node,里面有一个叫 name 的列;另一个叫 appname_thingy,里面有两个列:nameotherstuff。当创建一个新对象时,name 的值会被复制到两个表中……如果你了解规范化的概念,这样做就不太好了 :-)

有没有人能告诉我,如何在不重新定义的情况下修改“Thingy”中“name”属性的 max_length 值?

1 个回答

3

你的实现完全不对,这不是父类和子类应该写的方式。你要么在父类里定义名字,要么在子类里定义。如果你在父类里定义了名字,那么在子类里就不能再定义一次,因为那样会创建一个新的字段。所以如果你想在子类里改变最大长度,我建议你在子类里声明名字,这样任何从节点类继承的类都可以用自己的最大长度来设置自己的名字。

正确的实现方式是:

class Node(models.Model):
    #other class attributes

子类应该继承父类的属性,并添加自己的内容。

class Thingy(Node):
    name       = models.CharField(max_length=100)
    otherstuff = models.CharField(max_length=255)

现在当你查询的时候,你只会得到一个名字,而不是两个。

撰写回答