You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django 2.x中如何在数据库迁移时/后批量预置数据(非手动/备份恢复)

在Django 2.x中批量填充默认数据库记录的方案

嘿,这个需求我帮你梳理下,Django里完全不用手动录入或备份恢复,有两种非常实用的方式来实现,刚好适配你要给服务模型添加3条默认条目的场景:

方法一:使用数据迁移(Data Migrations)

这是Django官方推荐的一次性初始数据填充方式,数据会被纳入迁移历史,避免重复创建。步骤如下:

  1. 生成空的迁移文件
    在终端执行命令,替换yourappname为你的服务模型所在的应用名称:

    python manage.py makemigrations --empty yourappname
    
  2. 编辑迁移文件
    打开生成的迁移文件(位于yourappname/migrations/目录下,文件名类似0002_auto_xxxxxx_xxxx.py),修改内容如下:

    from django.db import migrations
    
    def add_default_services(apps, schema_editor):
        # 注意:这里必须用apps.get_model获取模型,不能直接导入
        Service = apps.get_model('yourappname', 'Service')
        # 使用get_or_create避免重复执行迁移时创建重复记录
        Service.objects.get_or_create(name='基础服务A', description='提供基础功能支持')
        Service.objects.get_or_create(name='增值服务B', description='提供高级增值功能')
        Service.objects.get_or_create(name='定制服务C', description='提供个性化定制方案')
    
    class Migration(migrations.Migration):
    
        dependencies = [
            ('yourappname', '0001_initial'),  # 这里是上一个迁移文件的名称,根据实际修改
        ]
    
        operations = [
            migrations.RunPython(add_default_services),
        ]
    
  3. 执行迁移
    运行命令完成数据填充:

    python manage.py migrate
    

方法二:使用post_migrate信号

如果你的默认数据需要每次执行迁移后都确保存在(比如防止误删后自动恢复),可以用Django的信号机制:

  1. 创建信号处理文件
    在你的应用目录下新建signals.py,写入以下代码:

    from django.db.models.signals import post_migrate
    from django.dispatch import receiver
    from .models import Service
    
    @receiver(post_migrate)
    def create_default_services(sender, **kwargs):
        # 仅在当前应用迁移时触发,避免影响其他应用
        if sender.name == 'yourappname':
            default_services = [
                {'name': '基础服务A', 'description': '提供基础功能支持'},
                {'name': '增值服务B', 'description': '提供高级增值功能'},
                {'name': '定制服务C', 'description': '提供个性化定制方案'},
            ]
            # 遍历创建,同样用get_or_create避免重复
            for service_data in default_services:
                Service.objects.get_or_create(**service_data)
    
  2. 注册信号
    打开应用目录下的apps.py,修改AppConfig类:

    from django.apps import AppConfig
    
    class YourAppConfig(AppConfig):
        name = 'yourappname'
    
        def ready(self):
            # 导入信号文件,确保信号被注册
            import yourappname.signals
    
  3. 配置默认应用配置
    在应用目录下的__init__.py中添加:

    default_app_config = 'yourappname.apps.YourAppConfig'
    

两种方法的区别

  • 数据迁移:一次性执行,记录在迁移历史中,适合固定的初始数据,执行后除非回滚迁移,否则不会重复操作。
  • post_migrate信号:每次执行migrate命令都会检查并创建缺失的默认数据,适合需要始终存在的系统基础数据。

内容的提问来源于stack exchange,提问作者Aleks Porberevskiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:47:52