V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
coolair
V2EX  ›  Django

Django makemigrations 生成的 migrations 文件,如何放在代码当前目录的文件夹中?

  •  
  •   coolair · 173 天前 · 703 次点击
    这是一个创建于 173 天前的主题,其中的信息可能已经有所发展或是发生改变。
    自己创建的 app 默认就在 app 目录下的 migrations 文件夹中,如果是使用 pip 安装的包,对包里面的 models 进行了变更,对应的 migrations 就放在 venv 下包的目录里了。

    有没有办法将这些 migrations 文件放在修改他代码的当前目录下的 migrations 里,保证 venv 环境不会变更?
    8 条回复    2023-11-06 16:13:12 +08:00
    HashV2
        1
    HashV2  
       173 天前
    对包里面的 models 进行更改不是就已经更改了 venv 环境了吗?话说为什么你会对包里面的 models 进行更改
    coolair
        2
    coolair  
    OP
       173 天前
    @HashV2 #1 对包里面的 models 进行更改,可以不修改 venv 环境啊,比如,我想加个字段,可以引入这个 model 然后用 add_to_class 添加一个字段。
    HashV2
        3
    HashV2  
       173 天前
    @coolair 我之前是在自己的包里继承原 model 添加重写的,然后在 settigns.py 里 DATABASE_ROUTERS 指定原 app_label 的 allow_migrate=False ,不知道是否适用你的场景
    crazycookie
        4
    crazycookie  
       173 天前
    migrations 对应的是 db 的修改记录
    如果一个全新的项目( 数据为 0 的情况下,是有文件夹但是里面没有 0 开头的 migrate 文件的)

    对于 migrations 文件的矛盾点是:要不要进入 Git 的版本管理

    如果不版本管理 gitignore 的话,记得要自己在文件夹中 touch __init__.py 文件,不然的话,migrate 运行的时候没有效果(笑

    如果放入 Git 的问题是,如果你多个实例运行,db 不一样的话,挺痛苦的, 而且,还有 migrate 的时候,的选择项不一样

    结论:
    我自己的项目是 gitignore migrations 文件夹的, 因为他是 migrate db 的 log 记录,没必要放到 Git 代码库中

    所以,你 pip 发布的时候,migrations 文件就应该是无的, 以后产生的内容,是使用者自己生成的管理他对应的 db 的修改记录
    Hstar
        5
    Hstar  
       173 天前
    你不应该用 add_to_class 持久的修改一个 Model ,这是用来临时附加模型字段用的。

    如果你需要改其他包里的 models ,可以在自己包里继承一个继续写,然后更改 model 饮用指向。如果要改更多逻辑,唯一稳妥的办法就是不使用 pip 而是把包直接下载到项目目录当作一个 app 来玩。
    HashV2
        6
    HashV2  
       173 天前
    @crazycookie 还是要看业务场景,如果不记录 migrations 变更记录文件的话,初始化部署没有问题,但是在服务器增量更新的时候需要 makemigrations ,这个阶段可能会有预料之外的错误。
    founddev
        7
    founddev  
       173 天前
    版本控制 migrations 文件,线上环境不应该进行 makemigrations
    mike1936
        8
    mike1936  
       173 天前
    `<项目目录>/<项目名>/settings.py` 里的 MIGRATION_MODULES 配置可以把第三方 app 的 migrations 进行重定向,例如设置:
    ```
    MIGRATIONS_MODULES = {
    'auth': 'migrations.auth',
    }
    ```
    会将第三方的名为 auth 的 app 的 migrations 模块的索引转移到`<项目目录>/auth/migrations/`里,然后就可以都放进版本控制里了,btw:第三方的 app 名可以通过 showmigrations 查看

    至于版本控制,修改 model 的 commit 顺便要执行 makemigrations/自己构造 migrations 文件并把迁移文件加到同一个 commit 里,其他机器 pull 下来之后只 migrate
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2672 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:00 · PVG 19:00 · LAX 04:00 · JFK 07:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.