Django:添加整数字段后在应用程序上运行 makemigrations 时出现“未知列”

     2023-02-24     70

关键词:

【中文标题】Django:添加整数字段后在应用程序上运行 makemigrations 时出现“未知列”【英文标题】:Django: "Unknown Column" when run makemigrations on an app after adding an Integer Field 【发布时间】:2015-11-28 17:03:17 【问题描述】:

首先,我最近从 Django 1.6 升级到 1.8,从未使用过 South,所以我是迁移新手。

我刚刚跑了:

> python manage.py makemigrations myapp
> python manage.py migrate --fake initial

使用现有 MySQL 表为我的模型创建初始迁移。到目前为止,一切似乎都很好。

然后我在我的模型中添加了一个 IntegerField:

new_integer_field = models.IntegerField(default = 50) #can include blank=True, null=True; seems to make no difference

现在当我跑步时:

>python manage.py makemigrations myapp

我明白了

django.db.utils.OperationalError: (1054, "Unknown column 'myapp_mymodel.new_integer_field' in 'field list'")

回溯(从问题发生的地方开始)是:

Traceback (most recent call last):
    File "./manage.py", line 10, in <module>
        execute_from_command_line(sys.argv)
    File ".../django/core/management/__init__.py", line 338, in execute_from_command_line
        utility.execute()
    File ".../django/core/management/__init__.py", line 312, in execute
        django.setup()
    File ".../django/__init__.py", line 18, in setup
        apps.populate(settings.INSTALLED_APPS)
    File ".../django/apps/registry.py", line 115, in populate
        app_config.ready()
    File ".../autocomplete_light/apps.py", line 9, in ready
        autodiscover()
    File ".../autocomplete_light/registry.py", line 298, in autodiscover
        autodiscover_modules('autocomplete_light_registry')
    File ".../django/utils/module_loading.py", line 74, in autodiscover_modules
        import_module('%s.%s' % (app_config.name, module_to_search))
    File ".../python2.7/importlib/__init__.py", line 37, in import_module
        __import__(name)
    File ".../mymapp/autocomplete_light_registry.py", line 42, in <module>
        x = other_model.other_model_manager.manager_function(),
    File ".../myapp/models.py", line 759, in get_a_queryset
        stus = a_queryset
    File ".../myapp/models.py", line 92, in get_another_queryset
        if obj.model_function(prog):
    File ".../myapp/models.py", line 402, in model_function
        z = object.MyManagerObjects.manager_function(self)
    File ".../myapp/models.py", line 573, in get_type
        curstart = mymodel.MyManagerObjects.get().old_field
    File ".../python2.7/site-packages/django/db/models/manager.py", line 127, in manager_method
        return getattr(self.get_queryset(), name)(*args, **kwargs)
    File ".../python2.7/site-packages/django/db/models/query.py", line 328, in get
        num = len(clone)
    File ".../python2.7/site-packages/django/db/models/query.py", line 144, in __len__
        self._fetch_all()
    File ".../python2.7/site-packages/django/db/models/query.py", line 965, in _fetch_all
        self._result_cache = list(self.iterator())
    File ".../python2.7/site-packages/django/db/models/query.py", line 238, in iterator
        results = compiler.execute_sql()
    File ".../python2.7/site-packages/django/db/models/sql/compiler.py", line 840, in execute_sql
        cursor.execute(sql, params)
    File ".../python2.7/site-packages/django/db/backends/utils.py", line 79, in execute
        return super(CursorDebugWrapper, self).execute(sql, params)
    File ".../python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
        return self.cursor.execute(sql, params)
    File ".../python2.7/site-packages/django/db/utils.py", line 97, in __exit__
        six.reraise(dj_exc_type, dj_exc_value, traceback)
    File ".../python2.7/site-packages/django/db/backends/utils.py", line 64, in execute
        return self.cursor.execute(sql, params)
    File ".../python2.7/site-packages/django/db/backends/mysql/base.py", line 124, in execute
        return self.cursor.execute(query, args)
    File ".../python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
        self.errorhandler(self, exc, value)
    File ".../python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
        raise errorclass, errorvalue
django.db.utils.OperationalError: (1054, "Unknown column 'myapp_mymodel.new_integer_field' in 'field list'")

MyManager 很简单,如下:

class MyManager(models.Manager):
    def get_queryset(self):
        return super(MyManager, self).get_queryset().filter(...some filters...) #this is guaranteed to return a queryset with one object in it.

在 myapp/models.py 内部:

MyManagerObjects = MyManager()

那么,我的问题是,为什么我不能在 mymodel 中添加一个字段并运行 makemigrations?什么是打破经理?我从那里开始堆栈跟踪,因为我尝试了各种不同的注释策略,这些策略似乎指向这个经理,不管之前的调用是什么。

我确定希望有人能告诉我这是我没有看到的快速简单的东西,但我不确定情况会如何!其他人有这个问题或有什么建议吗?

----****---- 更新 1:错误不仅仅发生在 makemigrations 上——因为一些评论者问我运行 python manage.py migrate 时会发生什么,我想我会尝试一下,尽管没有什么可以迁移的。我期待被告知没有什么要迁移的,但我得到了同样的错误。所以它不是 makemigrations 代码本身;它无法运行,因为它找不到新字段。 不知何故,它正在查看模型并找到它无法识别的字段。但是为什么呢?!

----****---- 更新2:我添加了回溯的开始......我不愿意发布任何实际路径/模型名称,因此进行了编辑。希望没关系。注意 - 据我所知,它与 autocomplete_light 无关(除非它是!),因为当我注释掉 x = other_model.other_model_manager.manager_function() 行(autocomplete_light_registry.py 中的第 42 行)时,在没有参考 autocomplete_light 的情况下发生错误。我在这里添加了第二个回溯,以防万一也有帮助!

Traceback (most recent call last):
    File "./manage.py", line 10, in <module>
        execute_from_command_line(sys.argv)
    File ".../django/core/management/__init__.py", line 338, in execute_from_command_line
        utility.execute()
    File ".../django/core/management/__init__.py", line 312, in execute
        django.setup()
    File ".../django/__init__.py", line 18, in setup
        apps.populate(settings.INSTALLED_APPS)
    File ".../django/apps/registry.py", line 115, in populate
        app_config.ready()
    File ".../django/contrib/admin/apps.py", line 22, in ready
        self.module.autodiscover()
    File ".../django/contrib/admin/__init__.py", line 24, in autodiscover
        autodiscover_modules('admin', register_to=site)
    File ".../django/utils/module_loading.py", line 74, in autodiscover_modules
        import_module('%s.%s' % (app_config.name, module_to_search))
    File ".../python2.7/importlib/__init__.py", line 37, in import_module
        __import__(name)
    File ".../myapp/admin.py", line 151, in <module>
        class MyListFilter(SimpleListFilterWithDefault):
    File ".../myapp/admin.py", line 154, in MyListFilter
        x = mymodel.MyManagerObjects.get()
    File ".../django/db/models/manager.py", line 127, in manager_method
        return getattr(self.get_queryset(), name)(*args, **kwargs)
    File ".../django/db/models/query.py", line 328, in get
        num = len(clone)
    File ".../django/db/models/query.py", line 144, in __len__
        self._fetch_all()
    File ".../django/db/models/query.py", line 965, in _fetch_all
        self._result_cache = list(self.iterator())
    File ".../django/db/models/query.py", line 238, in iterator
        results = compiler.execute_sql()
    File ".../django/db/models/sql/compiler.py", line 840, in execute_sql
        cursor.execute(sql, params)
    File ".../django/db/backends/utils.py", line 79, in execute
        return super(CursorDebugWrapper, self).execute(sql, params)
    File ".../django/db/backends/utils.py", line 64, in execute
        return self.cursor.execute(sql, params)
    File ".../django/db/utils.py", line 97, in __exit__
        six.reraise(dj_exc_type, dj_exc_value, traceback)
    File ".../django/db/backends/utils.py", line 64, in execute
        return self.cursor.execute(sql, params)
    File ".../django/db/backends/mysql/base.py", line 124, in execute
        return self.cursor.execute(query, args)
    File ".../MySQLdb/cursors.py", line 205, in execute
        self.errorhandler(self, exc, value)
    File ".../MySQLdb/connections.py", line 36, in defaulterrorhandler
        raise errorclass, errorvalue
django.db.utils.OperationalError: (1054, "Unknown column 'myapp_mymodel.new_integer_field' in 'field list'")

【问题讨论】:

第二次运行 makemigrations 后是否运行了迁移? @karthikr 我不能;当我运行 python manage.py makemigrations myapp 时会发生错误,因此没有什么要迁移的。 整个回溯还有助于识别应用失败时所处的初始化阶段。 好的,我加了,还有第二个。 显然我可以手动添加该字段并继续。我宁愿弄清楚发生了什么:) 【参考方案1】:

您似乎在导入模块或注册应用程序时进行 db 查询: curstart = mymodel.MyManagerObjects.get().old_field

这意味着当您运行任何管理命令(如 runservermakemigrationsmigrate)时,如果您更改了模型,那么它们将与您的数据库不同步,并且进行查询将引发异常在命令可以执行应有的操作之前(例如进行迁移)。

如果可能,请修改您的代码,以便在加载时不调用 MyManagerObjects.get(),例如通过使用 lambda 函数或将其包装在您可以在运行时调用的方法中。

如果这不可行,您需要在每次进行或运行迁移时注释掉该部分代码,但这真的很麻烦。

更新: 在完整的回溯中有一行:

File ".../myapp/admin.py", line 154, in MyListFilter
    x = mymodel.MyManagerObjects.get()

这意味着在导入管理文件时正在运行get。我认为您可能需要在MyListFilter.queryset() 中而不是在类声明中调用mymodel.MyManagerObjects.get()

https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

【讨论】:

我尝试了一个以前从未使用过的 lambda 函数,因此我想进一步探索这些建议。不过,这很奇怪,不是吗,回溯不指向经理?为什么它在使用管理器而不是管理器本身的查询时结束? 好的,所以现在我尝试在管理器中创建一个 lambda(没有更改)并在发生错误的地方创建一个 lambda。后者在 lambda 函数处产生错误。以下内容有意义吗? curstart = lambda: mymodel.MyManagerObjects.get().old_field 然后curstart = curstart() 如果是这样,没有成功,错误仍然出现在 lambda 行。我想知道 django 的 objects 代码是如何解决这个问题的? 更新非常有帮助 - 它解决了那个版本的问题。第一次回溯仍在发生,目前尚不清楚如何在自动完成灯光下修复它。问题在于注册自动完成时设置choices。使用 lambda 并没有帮助。现在看来,这可能是一个与自动完成灯光相关的新问题。至少我现在明白了一点。谢谢! 是的,问题是在导入autocomplete_light_registry.py 时似乎正在调用x = other_model.other_model_manager.manager_function() 如果没有看到代码,我真的无法提出好的建议,但是 Django 通常会通过在选择是静态的情况下使用 choices 之类的属性来处理查询集、选择、模板名称等的此类情况以及像get_choices() 这样的方法,用于动态选择。你能把你正在计算的东西包装在 get_choices 方法中并稍后调用它,例如在 __init__() 中吗?【参考方案2】:

它不应该是:

python manage.py makemigrations mymodel

应该是:

python manage.py makemigrations myapp

所以注释掉new_integer_field,我想再做一次。

您还需要运行migrate 以在数据库表中添加new_integer_field列。

python manage.py makemigrations myapp
./manage.py migrate --fake
# add new_integer_field
./manage.py makemigrations myapp
./manage.py migrate

【讨论】:

对不起,我两次都在运行python manage.py makemigrations myapp。以上已更正。 是的,但是我的第二条评论解决了您的问题吗? 你是说你说在哪里运行makemigrations,然后迁移?我不能做这两件事。 makemigrations 不起作用,所以没有什么要迁移的。此外, migrate 也会犯同样的错误。我在您的“第二条评论”中进入第 3 步并收到错误消息。如果这不是你的意思,那么我需要澄清一下。你的建议正是我想要做的(除了我的理解是它是--fake-initial,而不是--fake 这真的很奇怪。如果您注释掉 new_integer_field 并运行 makemigrations myapp 会发生什么?它应该告诉你没有变化,但我很好奇。只需这样做即可确认 --fake 是否有效。 是的,当我注释掉新字段时它告诉我没有任何变化(即将模型恢复到没有变化的状态)。

迁移后在 Django 上更改 db_table 不起作用,并且添加用户 (AbstractUser) 外键会破坏 __str__()

】迁移后在Django上更改db_table不起作用,并且添加用户(AbstractUser)外键会破坏__str__()【英文标题】:Changingdb_tableonDjangodoesn\'tworkaftermigrations,andaddingauser(AbstractUser)foreignkeybreaks__str__()【发布时间】:2021-05-0514:06:33【问题描述】:这... 查看详情

向 Django 模型添加动态字段

...上创建动态字段?假设我正在编写一个与股票市场相关的应用程序。我在某一天进行了购买,稍后我想根据今天的价格检查收益(或损失)。我会有这样的模型:classPurchase(models.Model):ticker=models.CharField(max_ 查看详情

django字段类型(fieldtypes)介绍

...不必直接使用该字段。如果你没在别的字段上指定主键,Django就会自动添加主键字段。BigIntegerField64位整数,类似于IntegerField,范围从-9223372036854775808到9223372036854775807。默认的formwidget 是T 查看详情

如何使用`django-filters`编写将在整数字段上使用范围过滤器的GraphQL查询?

】如何使用`django-filters`编写将在整数字段上使用范围过滤器的GraphQL查询?【英文标题】:HowtowriteaGraphQLquerythatwillusearangefilteronanintegerfieldusing`django-filters`?【发布时间】:2021-01-1708:38:22【问题描述】:我在我的GraphQLAPI中使用graphe... 查看详情

Django在查询集结果上添加附加字段[重复]

】Django在查询集结果上添加附加字段[重复]【英文标题】:Djangoaddingadditionalfieldonquerysetresult[duplicate]【发布时间】:2021-04-0218:58:05【问题描述】:我的Django上有这些代码defget(self,request):movie=Movie.objects.all().order_by(\'name\').first()serial... 查看详情

在 Django 模板中获取 Decimal 字段的整数部分

...回答过,我很抱歉。我有一个DecimalField,它来自我的django应用程序中的模板视图。我只需要显示它的整数部分。我该怎么做?================ 查看详情

内存警告后在 iOS 上运行 OpenGL 崩溃

...2-06-1206:13:38【问题描述】:我遇到了一个带有OpenGL组件的应用程序在iPad上崩溃的问题。该应用程序会引发内存警告并崩溃,但它似乎并没有使用那么多内存。我错过了什么吗?该应用基于Vuforia增强现实系统(大量借鉴ImageTargets... 查看详情

使用 Django 表单编辑图像字段

...正在创建一个允许用户查看和编辑他们自己的个人资料的应用程序。我最近添加了用户将个人资料图片添加到其个人资料的功能。我可以在管理页面中添加一个配置文件,它会显示在选定的用户配置文件上没问题。问题是当用户... 查看详情

Django - 如何在作为模型当前字段的模型表单上添加占位符?

】Django-如何在作为模型当前字段的模型表单上添加占位符?【英文标题】:Django-HowdoIaddaplaceholderonamodelformthat\'sthecurrentfieldofthemodel?【发布时间】:2019-02-0306:44:58【问题描述】:我希望能够像这样改变占位符:<inputplaceholder="inp... 查看详情

在表单中的特定字段上引发 Django 中的错误

...时间】:2022-01-2206:12:39【问题描述】:在我的Django/Python应用程序中,我有必要或不需要的字段,具体取决于在之前的字段中选择的内容。这就是为什么默认情况下这些不是强制性的。我想运行一个脚本,该脚本会根据选择在所... 查看详情

Django:1215,“无法在只有一个字段的模型上添加外键约束”

】Django:1215,“无法在只有一个字段的模型上添加外键约束”【英文标题】:Django:1215,\'Cannotaddforeignkeyconstraint\'onmodelwithonlyonefield【发布时间】:2019-01-0110:34:38【问题描述】:我有一个Salad模型:classSalad(models.Model):some_field=models.... 查看详情

Spritekit 应用程序在设备上运行时崩溃,在 swift 3 转换后在模拟器上工作

】Spritekit应用程序在设备上运行时崩溃,在swift3转换后在模拟器上工作【英文标题】:Spritekitappcrasheswhenrunondevice,worksonsimulatorafterswift3conversion【发布时间】:2016-10-0819:23:43【问题描述】:在swift3转换之前,我的应用程序之前在设... 查看详情

Django 迁移错误:您无法更改 M2M 字段或从 M2M 字段更改,或通过 = 在 M2M 字段上添加或删除

】Django迁移错误:您无法更改M2M字段或从M2M字段更改,或通过=在M2M字段上添加或删除【英文标题】:Djangomigrationerror:youcannotaltertoorfromM2Mfields,oraddorremovethrough=onM2Mfields【发布时间】:2015-01-1117:01:43【问题描述】:我正在尝试将M2M... 查看详情

django数据库添加字段

在Djangobook的第十章讲到数据库添加字段的问题:使用的技巧是利用Django不关心表里是否包含model里所没有的列的特性。策略就是现在数据库里加入字段,然后同步Django的模型以包含新字段然后后面就是一大段方法。1.首先,进入... 查看详情

如何在 django 中添加项目下拉菜单

...0-2500:41:48【问题描述】:我正在为发布博客制作一个网络应用程序。我添加了类别字段来标识该博客的类别。但问题是我只能在管理页面上添加类别。但我想要添加前端的类别按钮也是如此。示例:当我单击类别字段时,它会显... 查看详情

安装 cloud_firestore 包后在 Flutter 中的 iOS 模拟器上运行应用程序时出错

】安装cloud_firestore包后在Flutter中的iOS模拟器上运行应用程序时出错【英文标题】:GettingerrorwhenrunningapponiOSsimulatorinFlutterafterinstallingcloud_firestorepackage【发布时间】:2021-06-1700:12:59【问题描述】:安装cloud_firestore包后,在iOS模拟器... 查看详情

如何运行迁移并添加电话号码

...已经pip安装了phonenumber字段模块并将其添加到我已安装的应用程序中,但现在当我尝试运行迁移以将此字段的表单添加到我的数据库中时。我得到这个错误。我做错了什么。File"C: 查看详情

使用迁移向 Django 中的模型字段添加索引

...6【问题描述】:我正在尝试使用Field.db_index为具有迁移的应用程序添加模型字段的索引。看着Django\'sdocumentation,我需要做的就是设置db_index=True:classPerson(models.Mod 查看详情