首页 > 解决方案 > (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属性中添加了一个,因此我的模型在此列中有一个空字段是可以接受的。

非常感谢您的帮助。祝你有美好的一天。

标签: mysqldjangodjango-modelsdjango-migrations

解决方案


我通过回滚到上次稳定迁移解决了我的问题。从那里我能够迁移一个没有“mat”并且“pos_mat”是唯一属性的模型。这意味着我的问题出现在第一次从旧版本的“mat”迁移到新版本的“mat”中。基本上保持相同的名称但更改属性特征是不行的。我希望那些有同样问题的人能够用这个来解决它。


推荐阅读