【问题标题】:Django apply migrate for inherit modelsDjango为继承模型申请迁移
【发布时间】:2021-10-30 01:22:11
【问题描述】:

我有一个基本模型 BaseStage 和两个继承模型 TestSpend , StageSpend

class BaseStage(models.Model):
    name = models.CharField
    date = models.DateField
.......

class TestSpend(BaseStage):
    direction = models.CharField


class StageSpend(BaseStage):
    direction = models.CharField

现在我尝试向 Meta 添加约束字段

class Meta:
    verbose_name = ''
    verbose_name_plural = ''
    constraints = [
         models.UniqueConstraint(
             fields=['direction', 'name', 'date'], name='unique_name'
         )
     ]

适用于两种型号。成功运行makemigrations命令,但是当运行migarte得到了

django.db.utils.ProgrammingError: column "name" named in key does not exist

【问题讨论】:

  • 有'BaseStage'设置class Meta: abstract=True?如果没有,您将无法按照您的方式使用您的模型。 class Meta 你是写在TestSpeedStageSpend 还是BaseStage
  • 我将abstract=True 添加到我的基本模型并成功迁移。谢谢!如果你愿意,你可以把它写成答案,我会接受它

标签: django django-migrations


【解决方案1】:

试试这个:

class BaseStage(models.Model):
    name = models.CharField(max_length=30)
    date = models.DateField()
    # Other fields
    
    @property
    def direction(self):
        raise NotImplemented
   
    class Meta:
        abstract = True
        constraints = [UniqueConstraint(name='%(class)s_unique_name', fields=['direction', 'name', 'date'])]

class TestSpend(BaseStage):
    direction = models.CharField(max_length=30)


class StageSpend(BaseStage):
    direction = models.CharField(max_length=30)

用您的需要替换各种max_length 值。请注意,现在各个子类中 direction 字段的实现始终相同,因此您可以使用一个独特的模型,也许可以使用描述阶段类型的选择字段。

【讨论】:

    猜你喜欢
    • 2016-10-08
    • 2019-03-28
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多