Django将继承模型上的IntegerField更改为DecimalField
在Django中,我有两个从抽象基类继承的模型。基类有一个IntegerField,我想将其重命名,并在某些实例中更改为DecimalField。有一个ForeignKey链接两个子模型。我在文档中读过关于模型继承的内容,但似乎有一些。将IntegerField更改为DecimalField的最佳方法是什么Django将继承模型上的IntegerField更改为DecimalField,django,inheritance,django-models,Django,Inheritance,Django Models,在Django中,我有两个从抽象基类继承的模型。基类有一个IntegerField,我想将其重命名,并在某些实例中更改为DecimalField。有一个ForeignKey链接两个子模型。我在文档中读过关于模型继承的内容,但似乎有一些。将IntegerField更改为DecimalField的最佳方法是什么 class Parent(models.Model): intfield = models.IntegerField() class Meta: ab
class Parent(models.Model):
intfield = models.IntegerField()
class Meta:
abstract=True
class Child1(Parent):
addedfield = models.CharField(max_length=20)
class Child2(Parent):
addedfield2 = models.DecimalField(max_digits=10, decimal_places=2)
linked = models.ForeignKey(Child1, on_delete=models.CASCADE)
class GrandChild1(Child1):
# change intfield to decimal
class GrandChild2(Child2):
# change intfield to decimal
# linked to GrandChild1 instead of Child1
您可以使用额外的抽象模型来更改层次结构中的字段:
类父级(models.Model):
intfield=models.IntegerField()
类元:
抽象=真
类后代类型1(父级):
“”“这是从父模型继承的抽象模型,类型为“1”
属性。
"""
addedfield=models.CharField(最大长度=20)
类元:
抽象=真
类后代类型2(父级):
“”“这是从父模型继承的抽象模型,类型为“2”
属性。
"""
addedfield2=型号.小数字段(最大位数=10,小数位数=2)
linked=models.ForeignKey(
“儿童1”,
在_delete=models.CASCADE上,
#这是抽象模型中外键字段所必需的。
#请参阅下面的“关于外键相关名称的说明”。
related_name=“%(应用程序标签)s_%(类)s_related”,
相关的_查询_名称=“%(应用程序标签)s_uu%(类)ss”,
)
类元:
抽象=真
类Child1(后代类型1):
“”“具有“类型1”属性的后代。”“”
类别Child2(后代类型2):
“”“具有“类型2”属性的后代。”“”
类别1(后代类型1):
intfield=models.DecimalField(…)
第2类(后代类型2):
intfield=models.DecimalField(…)
linked=models.ForeignKey(
“第1条”,
在_delete=models.CASCADE上,
)
关于外键相关名称的说明
具有外键的抽象模型需要为从其继承的每个具体模型使用不同的相关名称
和相关查询名称
,否则每个子类的反向关系名称都是相同的
为了处理这个问题,django允许您将模板字符串与变量app_label
和class
一起使用,以便子模型的名称是唯一的
您可以找到。谢谢您的回答。当我尝试使用Child1作为后代类型2上的ForeignKey创建迁移时,它生成了一个错误`NameError“Child1”未定义。我将其移动到子模型中,它成功了。这很奇怪。您是否更改了字符串中的“Child1”(通过删除引号)?如果模型还不存在,它应该仍然能够引用该模型。不过我可能错了。它也可能是针对django迁移的。你是对的,我不小心漏掉了引号。如果我在抽象类上更改它,则意味着所有相关引用都被重命名。更改child模型似乎可以让前端的一切都正常工作。对于在抽象模型上使用Child1的好处,我有点困惑。如果相关查询被重构,我猜您可以对所有子类使用现有模板。如果在子类上重新定义了linked,它是否需要新模板?