mysql - (1054,“'字段列表'中的未知列''”)
问题描述
我知道这个问题已经被问过几次了,但以前没有答案能够解决我的问题。
我在 Django 中有一个完美的工作模型,看起来像这样:
class Template(models.Model):
mat = models.CharField(max_length=50, null=True)
...
我有很多这个模型的实例,到目前为止我对它非常满意。我最近决定,这个模型不是 Charfield,而是更适合在这个位置使用 ForeignKey。
更详细地说,属性“mat”以前仅指另一个对象实例的名称。我决定用 ForeignKey 将其更改为完整的实例,就像它应该一直那样。因此,对模型进行了如下修改:
class Template(models.Model):
mat = models.ForeignKey(Stock, on_delete=models.CASCADE, related_name='mat_stock', verbose_name="mat", null=True)
...
*/manage.py makemigrations
我用常规的,跟随这个变化*/manage.py migrate
。虽然这两个命令有效,但我无法在 shell 中选择任何 Template 实例而不引发以下错误:
OperationalError: (1054, "Unknown column 'myapp_template.mat_id' in 'field list'")
我遇到的类似情况是通过在 SQL 中手动添加以下行来解决的:
ALTER TABLE database.myapp_template ADD mat INT;
不幸的是,这并没有解决我的问题。
我想也许问题是我的对象的实例在“mat”列中有字符值。Django 在我迁移后会期望整数值(特别是“id”),所以我决定为 Template 创建一个全新的属性,如下所示:
class Template(models.Model):
pos_mat = models.ForeignKey(Stock, on_delete=models.CASCADE, related_name='mat_stock', verbose_name="mat", null=True)
...
我认为,这将删除(或忽略)“mat”列并创建具有所需属性的新“pos_mat”列,而无需处理不符合要求的旧字符值。从那里开始,它应该就像添加一个全新的 ForeignKey 属性。
在 required 和 successful 之后*/manage.py makemigrations
,*/manage.py migrate
我仍然无法在 shell 中访问我的模型实例。我仍然有同样的不愉快:
OperationalError: (1054, "Unknown column 'myapp_template.mat_id' in 'field list'")
有人知道如何说服 Django 同意我的更改吗?我怀疑将迁移回滚到零会对我有帮助(过去它没有解决我的问题),我希望它不会删除我的数据。由于我在null=True
属性中添加了一个,因此我的模型在此列中有一个空字段是可以接受的。
非常感谢您的帮助。祝你有美好的一天。
解决方案
我通过回滚到上次稳定迁移解决了我的问题。从那里我能够迁移一个没有“mat”并且“pos_mat”是唯一属性的模型。这意味着我的问题出现在第一次从旧版本的“mat”迁移到新版本的“mat”中。基本上保持相同的名称但更改属性特征是不行的。我希望那些有同样问题的人能够用这个来解决它。