一、使用django自带的命令行工具初始化数据库
python manage.py loaddata your_fixture.json
步骤:
1、创建.json数据文件
init_db.json:
[ { "model": "brand.brand", "pk": 50, "fields": { "name": "西门子", "first_letter": "x", "create_time": "2020-5-5" } }, { "model": "brand.brand", "pk": 51, "fields": { "name": "美的", "first_letter": "m", "create_time": "2020-5-5" } } ]
你可以把这个文件放到任意位置。
2、执行python manage.py loaddata命令
python manage.py loaddata mydjango/libs/utils/init_db.json
更为详细的使用方法参考:django官方文档
二、自定义django migrations文件
1、在某个应用的migrations文件夹下找到类似0001_intial.py文件添加如下内容:
# Generated by Django 2.2.13 on 2020-10-26 02:53
from django.db import migrations, models
from django.db import transaction
brand_data = [
{'id': 1, 'name': '西门子'},
{'id': 2, 'name': '美的'},
]
def initial_data(apps, schema_editor):
model = apps.get_model("brand", "Brand")
db_alias = schema_editor.connection.alias
with transaction.atomic():
for data in brand_data:
model .objects.using(db_alias).create(**data)
#这个class都是系统生成的内容,只需要添加最后一行
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Brand',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=20, verbose_name='名称')),
('logo', models.ImageField(blank=True, null=True, upload_to='', verbose_name='Logo图片')),
('first_letter', models.CharField(blank=True, max_length=1, null=True, verbose_name='品牌首字母')),
('create_time', models.DateField(auto_now_add=True, verbose_name='创建时间')),
],
options={
'verbose_name': '品牌',
'verbose_name_plural': '品牌',
'db_table': 'tb_brand',
},
),
migrations.RunPython(initial_data), #添加这一行
]
2、执行python manage.py migrate
执行migrate命令后就会执行初始化数据的代码了(提前是0001_initial.py这个文件还没有被同步到数据库过)。
三、使用signal信号
from django.dispatch import receiver
from django.db.models.signals import post_migrate, post_save
from itom_cmdb.apps.product.models import Product
@receiver(post_migrate)
def on_post_migrate(sender, **kwargs):
products = [
{
'id': DEFAULT_PRODUCT_ID,
'name': 'Default',
'code': 'default',
'status': Product.Status.ONLINE,
'create_by': 'python-migrate',
'update_by': 'python-migrate',
'comment': '系统默认项目'
}
]
for product in products:
Product.objects.get_or_create(
product,
code=product['code']
)
每次执行python manage.py migrate时都会被执行,注意这里是get_or_create。