在迁移期间阻止生产服务器上的Django app中的FieldDoesNotExist

时间:2015-11-15 14:36:22

标签: django django-models django-migrations

我以这种方式在服务器上运行迁移:

  1. 将models.py文件上传到服务器,其中包含一些新字段sfield即时模型Mobject
  2. 在manage.py
  3. 中执行makemigration命令
  4. 在manage.py中执行migrate命令 但是在django.core.exceptions.FieldDoesNotExist: Mobject has no field named 'sfield'失败的第一步结束和第三步结束之间有一些请求(很明显,因为django ORM无法从DB获取此字段但已经在Class中的字段,所以django将尝试要做到这一点)
  5. 是否可以将所有3个步骤设为“原子”?或者全局忽略这个例外,因为现在我不需要sfield,我只想要执行迁移而不需要例外。或者也许我可以通过某种方式临时标记新字段以防止django从数据库中获取它,但是对于makemigrations / migrate它必须是可见的吗?

1 个答案:

答案 0 :(得分:1)

如果你select * from yourtable,那么django会尝试获取模型中定义的所有字段。

您可以在自己的网站中使用only()来选择特定字段,这样在迁移orm尚未使用的新字段时不会引发任何异常

不过,您应该在本地创建迁移文件,测试本地计算机上的新字段,然后将迁移文件提交到服务器。在部署服务器时,您只需在部署后立即migrate,这样可以缩短发生异常的时间。

来自django docs的

  

有单独的命令可以制作和应用的原因   迁移是因为您将提交迁移到版本控制   系统并与您的应用程序一起发货;他们不仅让你的   开发更容易,它们也可供其他开发人员使用   生产