Django 2.x中如何在数据库迁移时/后批量预置数据(非手动/备份恢复)
在Django 2.x中批量填充默认数据库记录的方案
嘿,这个需求我帮你梳理下,Django里完全不用手动录入或备份恢复,有两种非常实用的方式来实现,刚好适配你要给服务模型添加3条默认条目的场景:
方法一:使用数据迁移(Data Migrations)
这是Django官方推荐的一次性初始数据填充方式,数据会被纳入迁移历史,避免重复创建。步骤如下:
生成空的迁移文件
在终端执行命令,替换yourappname为你的服务模型所在的应用名称:python manage.py makemigrations --empty yourappname编辑迁移文件
打开生成的迁移文件(位于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), ]执行迁移
运行命令完成数据填充:python manage.py migrate
方法二:使用post_migrate信号
如果你的默认数据需要每次执行迁移后都确保存在(比如防止误删后自动恢复),可以用Django的信号机制:
创建信号处理文件
在你的应用目录下新建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)注册信号
打开应用目录下的apps.py,修改AppConfig类:from django.apps import AppConfig class YourAppConfig(AppConfig): name = 'yourappname' def ready(self): # 导入信号文件,确保信号被注册 import yourappname.signals配置默认应用配置
在应用目录下的__init__.py中添加:default_app_config = 'yourappname.apps.YourAppConfig'
两种方法的区别
- 数据迁移:一次性执行,记录在迁移历史中,适合固定的初始数据,执行后除非回滚迁移,否则不会重复操作。
- post_migrate信号:每次执行
migrate命令都会检查并创建缺失的默认数据,适合需要始终存在的系统基础数据。
内容的提问来源于stack exchange,提问作者Aleks Porberevskiy
相关产品推荐
相关产品推荐

