django app数据库基础数据初始化的实现

本文介绍如何在Django应用迁移后自动执行基础数据初始化,通过连接post_migrate信号并定义自定义函数实现,确保每次迁移后都能更新或创建必要的数据库记录。

为了实现在django migrate 后,每个app进行相关基础数据的初始化工作。

查询了相关资料,可以使用链接post_migrate信号来实现。

在调用

python manage.py migrate

后,django会发起post_migrate信号,因此数据库基础数据的初始化可以写在这个里面。

具体实现如下:

在demoapp目录中,找到apps.py

from django.apps import AppConfig
from django.db.models.signals import post_migrate


def do_init_data(sender, **kwargs):
    from demoapp.init_data import init_datas
    init_datas()


class DemoappConfig(AppConfig):
    name = 'demoapp'

    def ready(self):
        post_migrate.connect(do_init_data, sender=self)

在demoapp目录中,增加init_data.py

from .models import *

def init_category():
    """
    初始化默认类别
    :return:None
    """
    if Category.objects.count()==0:
        Category.objects.create(Name='类别1')
        Category.objects.create(Name='类别2')
        Category.objects.create(Name='类别3')
    else:
        print('-->Category exists. Skiped.')

def init_datas():
    print('Initializing the category data...')
    init_category()
    print('-->Done.')

做完这些之后,执行migrate,发现结果没有去执行do_init_data。经研究发现,需要指定默认的app_config,于是,在demoapp目录中的__init__.py中增加:

from os import path

def get_current_app_name(file):
    return path.dirname(file).replace('\\', '/').split('/')[-1]

current_app_name=get_current_app_name(__file__)

default_app_config =current_app_name  + '.apps.'+current_app_name.capitalize()+'Config'

终于,在执行migrate后,成功执行了do_init_data

Django 初始化数据库的方法有多种,以下详细介绍: ### 使用 `post_migrate` 信号初始化数据库Django 1.8 及之后的版本,使用 `python manage.py migrate` 来同步数据库,此时可以使用 `post_migrate` 信号来初始化数据库。示例代码如下: ```python from django.db.models.signals import post_migrate from django.dispatch import receiver from your_app.models import YourModel @receiver(post_migrate) def populate_models(sender, **kwargs): if YourModel.objects.count() == 0: YourModel.objects.create(field1='value1', field2='value2') ``` 在上述代码中,`post_migrate` 信号在数据库迁移完成后触发,`populate_models` 函数会检查 `YourModel` 表中是否有数据,如果没有则创建初始数据。 ### 使用数据迁移文件初始化数据 可以创建一个数据迁移文件来初始化数据库。首先,运行以下命令创建一个空的数据迁移文件: ```bash python manage.py makemigrations --empty your_app ``` 然后,编辑生成的数据迁移文件,示例如下: ```python from django.db import migrations from your_app.models import YourModel def populate_models(apps, schema_editor): YourModel.objects.create(field1='value1', field2='value2') class Migration(migrations.Migration): dependencies = [ ('your_app', 'previous_migration_number'), ] operations = [ migrations.RunPython(populate_models), ] ``` 运行 `python manage.py migrate` 命令,该数据迁移文件中的 `populate_models` 函数会被执行,从而初始化数据库。 ### 使用 `initial_data.json` 文件初始化数据 编写初始化文件 `initial_data.json`,示例如下: ```json [ { "model": "your_app.YourModel", "pk": 1, "fields": { "field1": "value1", "field2": "value2" } } ] ``` 将该文件放在应用的 `fixtures` 目录下,运行 `python manage.py loaddata initial_data.json` 命令,Django 会从该文件中加载数据数据库中。 ### 使用 `post_syncdb` 信号(适用于旧版本 Django) 在较旧的 Django 版本中,可以使用 `post_syncdb` 信号来初始化数据库。不过在 Django 1.7 及之后的版本,`syncdb` 命令被弃用,取而代之的是 `migrate` 命令。示例代码如下: ```python from django.db.models.signals import post_syncdb from django.dispatch import receiver from your_app.models import YourModel @receiver(post_syncdb) def populate_models(sender, **kwargs): if YourModel.objects.count() == 0: YourModel.objects.create(field1='value1', field2='value2') ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值