gpt4 book ai didi

python - 如果django模型已经有相关类,如何将其转换为抽象模型

转载 作者:行者123 更新时间:2023-12-03 07:37:58 25 4
gpt4 key购买 nike

假设我有以下基本模型:

class human(models.Model):
gender = models.BooleanField()
age = models.IntegerField()
name = models.CharField(max_length=200)

两个模型继承它:

class superhero(human):
can_fly = models.BooleanField()

class villain(human):
fingerprint = models.ImageField()

在我的开发过程中的某个时候,我意识到我实际上并不直接需要人类类。我只需要它是一组 super 英雄和反派模型的模板参数。如果现在我转到 human Meta 类并设置 abstract=True 并像这样更改我的模型:

class human(models.Model):
gender = models.BooleanField()
age = models.IntegerField()
name = models.CharField(max_length=200)

class Meta:
abstract = True

class superhero(human):
can_fly = models.BooleanField()

class villain(human):
fingerprint = models.ImageField()

尝试进行迁移并迁移将引发以下错误

Local field u'gender' in class 'superhero' clashes with field of similar name from base class 'human'

如何切换到抽象类来保留所有迁移而不直接修改数据库?

最佳答案

因此,在再次阅读文档后,我找到了解决方案:

该错误是由于 Django 将模型保存到数据库的方式而引发的。从基本模型继承的所有模型 human没有全部 human自己的表中的字段。相反,它们只有自己的字段和一个将它们链接到 human 中相应行的外键。 table 。但是,当您从抽象类继承时,所有字段都会直接保存到模型的表中。所以当我尝试改变 human类(class) abstract=True并在 superhero 中继承它Django 类尝试创建 human 中的所有字段表 superhero表,该表仍然具有现有人类条目的外键,其字段名称完全相同。

警告

遵循此说明将获得所需的结果,但不幸的是将销毁 human 的所有条目 superherovillain型号

  1. 评论superherovillain模型,以便 Django 删除它们
  2. 进行迁移并迁移,以便 superherovillain表已删除
  3. 设置abstract=Truehuman
  4. 进行迁移并再次迁移。这将删除 human表,因为现在它是一个抽象类
  5. 取消注释superherovillain型号
  6. 进行迁移并迁移。这将创建 villainsuperhero包含 human 中所有字段的表类

就是这样。

附注为什么我需要转向抽象类?因为我想让我所有的villainssuperheroes独特使用unique_together进行一些数据库级别限制的参数。为了使这一切成为可能superhero字段必须位于一张表中。现在可以了。

关于python - 如果django模型已经有相关类,如何将其转换为抽象模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33721939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com