Django为模型初始化数据

一、使用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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值