2015-11-15 50 views
1

在生产服务器上的Django应用程序我以这种方式在服务器上运行的迁移:防止FieldDoesNotExist迁移

  1. 上传models.py文件服务器与一些新的领域sfield IM模式Mobject
  2. 在执行makemigration命令manage.py
  3. 在manage.py中执行migrate命令 但是,在第一步结束和第三步结束之间有一些请求失败,并且出现了django.core.exceptions.FieldDoesNotExist: Mobject has no field named 'sfield'(这很明显,因为django ORM无法从DB获取此字段但已经在Cla的领域ss,所以django会尝试去做)

是否有可能使所有3个步骤“原子”?或globaly忽略这个例外,因为现在我不需要sfield,我只想执行没有例外的迁移。或者可能是我可以用某种方式临时标记新字段以阻止django从数据库中获取它,但是它必须对makemigrations/migrate可见?

回答

1

如果你做select * from yourtable然后Django试图获取模型中定义的所有字段。

您可以使用您的ORM only()选择特定的领域,所以没有异常将同时迁移不是在ORM使用尚未

顺便说一句新的领域得到提升,你应该在本地创建迁移文件,测试新字段,然后将迁移文件提交给服务器。在部署服务器时,您只需在部署后立即使用migrate,这样可以缩短发生异常的时间。

从Django文档:

,有单独的命令做出和应用 迁移是因为你承诺迁移到版本控制系统 与您的应用程序附带他们的原因;它们不仅使您的开发更容易,而且其他开发人员也可以使用,也可以使用 生产。

+1

谢谢,是的,我同意 - 本地开发服务器是创建迁移的正确方法,但正如您提到的那样,它不会解决问题,它会将服务器迁移步骤减少到2:'Upload'和'migrate',但仍然一些请求可能会失败。只有有趣的事情,多亏你的坚定,我也发现'延期',我也会尝试。 – user3479125

+0

@ user3479125不错,祝你好运! ;) – doniyor