我正在使用Django 1.11.5并使用PyCharm作为我的IDE。我一直在尝试将我的应用名称从“clinicaltrials”重构为“cancer_trials”。 PyCharm相应地更新了我的所有项目文件。然后,我按照this SO answer中的步骤更新相应的数据库表。但是,当我尝试运行makemigration
时,我收到以下错误。我似乎无法弄清楚这意味着什么和/或我在这里缺少什么部分。
> python manage.py makemigrations
Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "C:\Python_3.6.1\lib\site-packages\django\core\management\__init__.py", line 364, in execute_from_command_line
utility.execute()
File "C:\Python_3.6.1\lib\site-packages\django\core\management\__init__.py", line 356, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python_3.6.1\lib\site-packages\django\core\management\base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
File "C:\Python_3.6.1\lib\site-packages\django\core\management\base.py", line 330, in execute
output = self.handle(*args, **options)
File "C:\Python_3.6.1\lib\site-packages\django\core\management\commands\makemigrations.py", line 150, in handle
loader.project_state(),
File "C:\Python_3.6.1\lib\site-packages\django\db\migrations\loader.py", line 323, in project_state
return self.graph.make_state(nodes=nodes, at_end=at_end, real_apps=list(self.unmigrated_apps))
File "C:\Python_3.6.1\lib\site-packages\django\db\migrations\graph.py", line 409, in make_state
project_state = self.nodes[node].mutate_state(project_state, preserve=False)
File "C:\Python_3.6.1\lib\site-packages\django\db\migrations\migration.py", line 92, in mutate_state
operation.state_forwards(self.app_label, new_state)
File "C:\Python_3.6.1\lib\site-packages\django\db\migrations\operations\fields.py", line 142, in state_forwards
for name, instance in state.models[app_label, self.model_name_lower].fields:
KeyError: ('cancer_trials', 'cancer_trials')
这是抛出错误的函数
def state_forwards(self, app_label, state):
new_fields = []
old_field = None
for name, instance in state.models[app_label, self.model_name_lower].fields:
if name != self.name:
new_fields.append((name, instance))
else:
old_field = instance
state.models[app_label, self.model_name_lower].fields = new_fields
# Delay rendering of relationships if it's not a relational field
delay = not old_field.is_relation
state.reload_model(app_label, self.model_name_lower, delay=delay)
答案 0 :(得分:2)
根据我的经验,最简单的解决方案是创建新应用并复制代码:
搜索stackoverflow.com或谷歌如何从项目中删除应用程序或只是留在那里。不幸的是,我对这些步骤并非100%肯定,如果我错了,有人请纠正我,但要记住我的回忆:
答案 1 :(得分:1)
删除项目中的所有迁移文件 浏览每个项目应用程序迁移文件夹并删除内部的所有内容, init .py文件除外。
删除当前数据库,如果是你的话,删除db.sqlite3。
答案 2 :(得分:0)
行 如果您想保留现有数据库,本指南可能对您有所帮助: https://simpleisbetterthancomplex.com/tutorial/2016/07/26/how-to-reset-migrations.html (方案2)
答案 3 :(得分:0)
关于如何在应用之间正确移动数据的一个很好的答案,可以找到here。
对我有用的是:
将数据导出到json
./manage.py dumpdata --exclude auth.permission --exclude contenttypes --exclude admin.LogEntry --exclude sessions --indent 2 > <path_out_of_the_project>/db.json
使用功能强大的编辑器打开db.json
文件,并将old app name
的所有实例重命名为the new app name
。
将您的应用和所有必要的引用重命名为您的代码。
删除数据库并重新创建应用所有迁移的新空数据库。
从db.json
文件加载包含new app
名称的数据。
./manage.py loaddata <path_out_of_the_project>/db.json
答案 4 :(得分:0)
简单方法:
通过进入每个应用程序的“迁移”命名目录来手动删除应用程序中的所有迁移。 注意:在“迁移”命名目录中删除 init .py不会造成任何危害。
“ appname”上方是指按照上述步骤一对一迁移的应用。对于添加的新应用程序,将仅显示接下来的两个“ migrate”和“ sqlmigrate”命令工作的已迁移表。
之后:
$:python manage.py makemigrations应用程序名称
$:python manage.py迁移应用名称
$:python manage.py sqlmigrate应用名称0001