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

Django模型生成空表,如何自动填充预设选项实例?

自动填充Django分类模型初始数据的方法

方法一:创建数据迁移文件(推荐)

这是Django官方认可的初始化数据方式,仅在执行迁移时运行一次,不会重复生成数据:

  1. 生成空迁移文件
    在终端执行命令,替换your_app_name为你的应用名称:
python manage.py makemigrations --empty your_app_name
  1. 编辑迁移文件
    打开生成的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),
    ]
  1. 执行迁移
    运行命令完成数据填充:
python manage.py migrate

方法二:使用post_migrate信号

适合需要在每次迁移完成后确保数据存在的场景(每次执行migrate都会检查并补全数据):

  1. 在应用目录下创建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)
  1. 在应用的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
  1. 触发信号
    运行python manage.py migrate,之后每次迁移完成都会自动检查并填充分类数据。

注意:两种方法都使用get_or_create方法,避免重复创建相同的分类条目,多次执行也不会产生冗余数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 22:07:11