Django 如何将一个 app 拆成两个 app?

2016-12-14 09:10:46 +08:00
 scriptB0y

一开始用 django-admin startapp 建了一个,随着开发,发现其中一个地方功能比较多,适合分出来做成另一个独立的 app ,请问如何将原有的这个拆出来呢?

views urls 都比较好搞,主要问题是 models ,如果移动了位置,会产生新的 migrations ,但其实数据的表结构是没有变的……

3642 次点击
所在节点    Python
14 条回复
wyntergreg
2016-12-14 09:14:53 +08:00
models 不需要移动的, import 就好
scriptB0y
2016-12-14 09:17:01 +08:00
@wyntergreg 但是有个 model 太大了,里面的东西也是原来的 app 相关的,比较想拆出来
wizardoz
2016-12-14 09:20:05 +08:00
如果移动了位置,会产生新的 migrations ,但其实数据的表结构是没有变的……
=============================================
./manage.py migrate --fake

--fake 就是让它以为已经 migrate 了,但是不真正的去操作数据库.
tamama
2016-12-14 09:25:21 +08:00
移动 model 产生新的 migration ,会导致数据库的表名也改变。可以在新的 app model 里边明确指定表名为原来 model 的表名就行了
scriptB0y
2016-12-14 09:31:31 +08:00
@tamama 对,这可能是我出错的原因,我试试移动之后改一下这个,多谢!
scriptB0y
2016-12-14 09:31:59 +08:00
@wizardoz 好像 makemigrations 这一步也会出错
wyntergreg
2016-12-14 09:57:39 +08:00
@scriptB0y make 的时候如果出错,可以看是什么错,直接改对应的 migrate 文件,这种做法可以止血,但治标不治本
wyntergreg
2016-12-14 10:04:36 +08:00
@scriptB0y 建议把 models 和 app 分开, models 直接放到一个 common_app 里边,业务逻辑 app 都分出去,这样做清静,不过貌似不符合 django 推荐的规范:)
scriptB0y
2016-12-14 10:52:06 +08:00
@wyntergreg 也是一种好办法 :)
qwer1234asdf
2016-12-14 12:22:22 +08:00
要不就 model 使用第三方 plugin 监控 history 咯
zeroten
2016-12-14 13:28:45 +08:00
定义 db_table 也没用么?
scriptB0y
2016-12-14 14:21:22 +08:00
@zeroten 有用了 谢谢
sallowdish
2016-12-14 17:36:21 +08:00
只想補一句,重構前把 unittest 寫好
dcoder
2018-06-13 09:00:45 +08:00
@scriptB0y @wyntergreg 我也感觉把 "models 直接放到一个 common_app" 里最清静啊,实际用起来有什么问题没?

我想的方案, 兼顾 model migration 的方便, 和以后抽象出 reusable Django app.
common_app 里定义所有的 models, 注意这里 common_app.models 是个 python 包 (带 __init__ 的文件夹).
然后各种业务逻辑,可以自由定义和重构在各个 empty-model 的 app 中, 也就是还是当 Django app 来些,只是 models.py 是空的, 真正的 models 还是从 common_app.models 里 import 的 (你也可以事先 import 到这个 app 的 empty models.py 中).
这样的话,各个业务逻辑的 app,就随便重构, 移动, 修改了.
万一哪天真想抽象出一个 reusable Django app, 可以 export 到另外的 project/server 中.
再自定义 migration 脚本, 把 common_app 中的 model 和 model data 导出来到这个 reusable app 中.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/327488

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX