Django将继承模型上的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

在Django中,我有两个从抽象基类继承的模型。基类有一个IntegerField,我想将其重命名,并在某些实例中更改为DecimalField。有一个ForeignKey链接两个子模型。我在文档中读过关于模型继承的内容,但似乎有一些。将IntegerField更改为DecimalField的最佳方法是什么

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,它是否需要新模板?