为了实现在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