Django模型生成空表,如何自动填充预设选项实例?
自动填充Django分类模型初始数据的方法
方法一:创建数据迁移文件(推荐)
这是Django官方认可的初始化数据方式,仅在执行迁移时运行一次,不会重复生成数据:
- 生成空迁移文件
在终端执行命令,替换your_app_name为你的应用名称:
python manage.py makemigrations --empty your_app_name
- 编辑迁移文件
打开生成的migrations/xxxx_initial_data.py文件(文件名中的xxxx是自动生成的数字),修改内容如下:
from django.db import migrations from yourappname.models import CategoryModel def populate_categories(apps, schema_editor): # 遍历选项列表,创建或获取分类实例 for code, name in CategoryModel.CATEGORY_CHOICES: CategoryModel.objects.get_or_create(category=code) class Migration(migrations.Migration): dependencies = [ # 这里会自动生成依赖项,比如('yourappname', '0001_initial'),保留即可 ] operations = [ migrations.RunPython(populate_categories), ]
- 执行迁移
运行命令完成数据填充:
python manage.py migrate
方法二:使用post_migrate信号
适合需要在每次迁移完成后确保数据存在的场景(每次执行migrate都会检查并补全数据):
- 在应用目录下创建
signals.py文件,写入以下代码:
from django.db.models.signals import post_migrate from django.dispatch import receiver from .models import CategoryModel @receiver(post_migrate) def populate_categories(sender, **kwargs): # 仅在当前应用迁移时触发 if sender.name == 'your_app_name': for code, name in CategoryModel.CATEGORY_CHOICES: CategoryModel.objects.get_or_create(category=code)
- 在应用的
apps.py中注册信号:
from django.apps import AppConfig class YourAppNameConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app_name' def ready(self): import yourappname.signals
- 触发信号
运行python manage.py migrate,之后每次迁移完成都会自动检查并填充分类数据。
注意:两种方法都使用get_or_create方法,避免重复创建相同的分类条目,多次执行也不会产生冗余数据。
内容的提问来源于stack exchange,提问作者Acno_Sama
相关产品推荐
相关产品推荐

