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

可以说我有以下基本模型:

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()

在开发过程中的某个时候,我意识到我实际上并不需要直接的人类阶级。我只需要它成为超级英雄和反派模型的一组模板参数。如果现在我进入人类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()

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

“超级英雄”类中的本地字段“性别”与基类“人类”中的相似名称的字段发生冲突

如何在不直接修改数据库的情况下切换到抽象类,保留所有迁移?

python大神给出的解决方案

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

由于Django将模型保存到数据库的方式而引发该错误。从基本模型human继承的所有模型在自己的表中都没有所有human字段。相反,它们只有自己的字段和外键,这些外键将它们链接到human表中的相应行。但是,当您从抽象类继承时,所有字段都直接保存到模型的表中。因此,当我尝试将human类更改为abstract=True并在superhero类中继承它时,Django尝试从human表中的superhero表创建所有字段,该表仍然具有使用现有人类条目的外键字段命名完全相同。

警告

遵循此指令将获得预期的结果,但不幸的是将破坏human superherovillain模型的所有条目

注释superherovillain模型,以便Django删除它们
进行迁移并进行迁移,以便删除superherovillain
abstract=True类中设置human
进行迁移并再次迁移。这将删除human表,因为现在它是一个抽象类
取消注释superherovillain模型
进行迁移并进行迁移。这将使用villain类的所有字段创建superherohuman

就是这个。

附言为什么我需要转向抽象课?因为我想使用villains参数使所有superheroesunique_together唯一,所以对数据库级别有一些限制。为了使之成为可能,所有superhero字段都必须放在一个表中。现在可以了。

PyCharm中Django的文档字符串中未解决的引用 - python

我在Django的专案中使用Google Style Python Docstrings like in this Example。当我创建一个类并在文档字符串中使用属性符号时,Pycharm总是说-“未解决的引用”。class Post(models.Model): """ Class for posts. Attribute…

子条件的python条件覆盖 - python

我试图找到一个python代码覆盖率工具,该工具可以衡量语句中是否包含子表达式:例如,我想看看下面的示例是否涵盖了condition1 / condition2 / condtion3?if condition1 or condition2 or condition3: x = true_value python大神给出的解决方案 对此的唯一合理答案是:当前…

USB设备发行 - python

我目前正在使用PyUSB。由于我不熟悉USB,所以我不知道如何执行以下操作。我已经从Python PyUSB成功连接到我的USB设备硬件。在代码中,我需要重置USB设备硬件。通过向硬件发送命令来完成。现在,在硬件重置后,我想从Python PyUSB释放当前的USB设备。然后,我想在重置后将其重新连接到USB设备硬件。请让我知道,如何释放USB设备连接和接口…

Python-熊猫描述了抛出错误:无法散列的类型“ dict” - python

更新:我正在使用“ Socrata开源API”中的一些示例代码。我在代码中注意到以下注释:# First 2000 results, returned as JSON from API / converted to Python # list of dictionaries by sodapy. 我不熟悉JSON。我已经下载了一个数据集,并创建了一个包含大量…

在Pytorch中重复张量的特定列 - python

我有一个大小为X的pytorch张量m x n和一个长度为num_repeats的非负整数n列表(假定sum(num_repeats)> 0)。在forward()方法中,我想创建一个大小为X_dup的张量m x sum(num_repeats),其中i的列X重复num_repeats[i]次。张量X_dup将在forward()方法的下游使用,因此需…