【问题标题】:KeyError: u'editable' when performing ./manage.py migrate for the first timeKeyError: u'editable' when perform ./manage.py migrate 第一次
【发布时间】:2017-04-26 06:34:52
【问题描述】:

我最近从 Django 1.3 升级到 1.8,并且在尝试设置迁移时遇到了问题。之前用过South,已经通过settings.py卸载了,并删除了他们在各个app里的文件夹。

尝试设置迁移时出现此错误:

root@ip:/home/# python manage.py migrate
Operations to perform:
  Synchronize unmigrated apps: web_forms, staticfiles, tinymce, messages, miscellaneous, generalpagess, gallery, template, import, navigation, frontpage, association
  Apply all migrations: admin, contenttypes, sites, auth, sessions
Synchronizing apps without migrations:
  Creating tables...
    Running deferred SQL...
  Installing custom SQL...
Running migrations:
  Rendering model states...Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/lib/python2.7/dist-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
    utility.execute()
  File "/usr/lib/python2.7/dist-packages/django/core/management/__init__.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/python2.7/dist-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/lib/python2.7/dist-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "/usr/lib/python2.7/dist-packages/django/core/management/commands/migrate.py", line 222, in handle
    executor.migrate(targets, plan, fake=fake, fake_initial=fake_initial)
  File "/usr/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 100, in migrate
    state.apps  # Render all real_apps -- performance critical
  File "/usr/lib/python2.7/dist-packages/django/utils/functional.py", line 59, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "/usr/lib/python2.7/dist-packages/django/db/migrations/state.py", line 166, in apps
    return StateApps(self.real_apps, self.models)
  File "/usr/lib/python2.7/dist-packages/django/db/migrations/state.py", line 226, in __init__
    self.real_models.append(ModelState.from_model(model, exclude_rels=True))
  File "/usr/lib/python2.7/dist-packages/django/db/migrations/state.py", line 345, in from_model
    name, path, args, kwargs = field.deconstruct()
  File "/usr/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 1253, in deconstruct
    del kwargs['editable']
KeyError: u'editable'

运行makemigrations时我也遇到同样的错误

root@:/home/# python manage.py makemigrations
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/lib/python2.7/dist-packages/django/core/management/__init__.py", line 354, in execute_from_command_line
    utility.execute()
  File "/usr/lib/python2.7/dist-packages/django/core/management/__init__.py", line 346, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/lib/python2.7/dist-packages/django/core/management/base.py", line 394, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/lib/python2.7/dist-packages/django/core/management/base.py", line 445, in execute
    output = self.handle(*args, **options)
  File "/usr/lib/python2.7/dist-packages/django/core/management/commands/makemigrations.py", line 99, in handle
    ProjectState.from_apps(apps),
  File "/usr/lib/python2.7/dist-packages/django/db/migrations/state.py", line 178, in from_apps
    model_state = ModelState.from_model(model)
  File "/usr/lib/python2.7/dist-packages/django/db/migrations/state.py", line 345, in from_model
    name, path, args, kwargs = field.deconstruct()
  File "/usr/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 1253, in deconstruct
    del kwargs['editable']
KeyError: u'editable'

一直在互联网上寻找解决方案,但没有成功。

【问题讨论】:

  • 我希望你先运行makemigrations
  • 谢谢@SijanBhandari 我也从那里得到同样的错误
  • 请发布与迁移相关的models.py。
  • 如果可以刷新数据,请尝试 dropdb db_name&gt; 并再次创建数据库并运行 makemigrations。它会起作用的。

标签: python django


【解决方案1】:

当我有一个具有 DatetimeField 的模型时,我遇到了类似的问题。模型如下所示

class MyModel(models.Model):
    time = models.DatetimeField(auto_now_add=True)
    time.editable = True

删除最后一行 time.editable = True 允许我在之后运行 python manage.py makemigrations appname 命令。

【讨论】:

    【解决方案2】:

    我终于找到了问题。它是通过阅读这个文件发现的

    File "/usr/lib/python2.7/dist-packages/django/db/models/fields/__init__.py", line 1253`
    

    说什么

    def deconstruct(self):
        name, path, args, kwargs = super(DateField, self).deconstruct()
        if self.auto_now:
            kwargs['auto_now'] = True
        if self.auto_now_add:
            kwargs['auto_now_add'] = True
        if self.auto_now or self.auto_now_add:
            del kwargs['editable']
            del kwargs['blank']
        return name, path, args, kwargs
    

    我的代码有 auto_now_add=True 用于时间字段,从这里阅读脖子胡须的故事后,我可以收集到不好的信息:Django auto_now and auto_now_add

    del kwargs['editable'] 部分引发了错误。

    【讨论】:

    • 猴子补丁这个方法
    • 这个肯定有其他的选择
    猜你喜欢
    • 2017-12-25
    • 2021-06-01
    • 2019-11-11
    • 1970-01-01
    • 2014-05-18
    • 2020-06-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多