我在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)
完成makemigrations
和migrate
后,我创建了一些模型对象:
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
拥有ForeignKey
到Symbol
,而不是{{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>
需要你的帮助。感谢
答案 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
。