Django:将foreignkey设置为“abstract”True ......的模型。

时间:2018-01-30 15:14:41

标签: django database migration database-migration

我在model中设计了一些django结构:

class Symbol(BaseModel):
    field1 = models.CharField(max_length=50)

    class Meta:
        abstract = True    

class DetailSymbol1(Symbol):
    field2 = models.CharField(max_length=50)

class DailyData(BaseModel):
    symbol = models.ForeignKey(DetailSymbol1)
    field3 = models.CharField(max_length=50)

完成makemigrationsmigrate后,我创建了一些模型对象:

In [1]: a = DetailSymbol1.objects.create(field1="a", field2="b")

In [2]: a.dailydata_set.create(field3="c")
Out[2]: <DailyData: DailyData object>

In [3]: a.dailydata_set.create(field3="d")
Out[3]: <DailyData: DailyData object>

In [4]: DailyData.objects.count()
Out[4]: 2

现在,我要做的是制作Symbol模型NOT abstract模型,让DailyData拥有ForeignKeySymbol,而不是{{1} }}。这是最终的代码:

DetailSymbol1

当我尝试class Symbol(BaseModel): field1 = models.CharField(max_length=50) class DetailSymbol1(Symbol): field2 = models.CharField(max_length=50) class DailyData(BaseModel): symbol = models.ForeignKey(Symbol) field3 = models.CharField(max_length=50) 时,会出现此提示:

migration

我不知道该怎么处理此消息。

如何在不丢失数据的情况下处理它?<​​/ p>

需要你的帮助。感谢

2 个答案:

答案 0 :(得分:0)

您收到此消息是因为您没有为您的字段提供默认值。由于您已经有了对象,因此除非您清除了数据库或提供了默认值,否则将收到此消息。或者另一个选项可以是将null = True设置为您的字段 - 这将使您能够保存对象而不为字段符号提供值。

此外,Django只会为models.Model的子类生成表,因此它不会首先为您的Symbol生成表。但是当您进行新的迁移并删除抽象时,它将创建新表。您不会丢失数据,只需提供null = True或默认值

答案 1 :(得分:0)

您可以在保留旧外键的同时向Symbol添加新的外键。

class DailyData(BaseModel):
    symbol = models.ForeignKey(DetailSymbol1)
    new_symbol = models.ForeignKey(Symbol)

然后创建数据迁移以填充new_symbol

最后,您可以将旧外键移至DetailSymbol1,并将new_symbol重命名为symbol