专栏首页社区的朋友们django 初始化默认数据的一个方法
原创

django 初始化默认数据的一个方法

作者:郭磊

导语: 经常可能会有的一个需求就是,一个表中会有一些默认数据,这些数据未来是可以通过管理端来配置的。所以数据库在被建立之后,会有一些默认数据被插入表中。工程跑起来后,视图函数还未被调用,所以必须要在其他地方来完成插入数据的要求。

django 提供了fixtures来完成对应的需求,具体可参考官方文档。其核心是写一个 fixtures 文件,然后命令行通过 loaddata 来完成数据表的初始化操作。但是我们并不能在蓝鲸的线上环境中操作命令行(也许有,但是我不太了解),线上环境是通过读取迁移文件来完成数据库的迁移操作的,所以可以通过把对应的代码写入migration 文件来完成数据库的初始操作。具体的操作方法如下:

home_application/models.py

class Person(models.Model):
    age = models.IntegerField()
    name = models.CharField(max_length=255)
    def __unicode__(self):
        return "age: {}; name: {}".format(self.age, self.name)

我们需要往 Person表中插入两条数据

age: 23, name: "zhangsan",
age: 24, name: "lisi"

在插入数据之前,需要先产生对应的表结构,在命令行运行

python manage.py makemigrations home_application 这条命令会产生对应的 migration 文件

然后,我们需要我们自己的迁移文件来初始化我们自己的数据。命令行运行

python manage.py makemigrations --empty home_application 这条命令会在刚才的 migration 文件夹下产生一个新的文件,我们的插入数据的方法就是在这里填写

官方文档给出了文件格式。我们需要给出两个可调用对象,forwards_func 用来执行插入数据的操作, reverse_func 用来执行回滚操作。方法的实现如下

home_application/migrations/0002_auto_20170728_2303.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models


def forwards_func(apps, schema_editor):
    Person = apps.get_model("home_application", "Person")
    db_alias = schema_editor.connection.alias
    Person.objects.using(db_alias).bulk_create([
        Person(age=23, name="zhangsan"),
        Person(age=24, name="lisi"),
    ])


def reverse_func(apps, schema_editor):
    Person = apps.get_model("home_application", "Person")
    db_alias = schema_editor.connection.alias
    Person.objects.using(db_alias).filter(age=23).filter(name="zhangsan").delete()
    Person.objects.using(db_alias).filter(age=24).filter(name="lisi").delete()


class Migration(migrations.Migration):
    # 注明依赖的文件,一定要写
    dependencies = [
        ('home_application', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(forwards_func, reverse_func),
    ]

然后执行

python manage.py migrate 对应的表和数据就都创建好了

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深入浅出 Nodejs( 二 ):Nodejs 文件模块机制

    本篇教程关于Nodejs的文件模块机制,具体讲CommonJs规范以及Nodejs文件模块的实现原理。

    serena
  • TAF 必修课(七):负载均衡

    前面在过载保护章节中已提及了负载均衡,顾名思义,本节要探究的对象为负载/请求。负载均衡除了起到过载预防的作用,本质上是提高了系统的吞吐量,最小化响应时间,到达资...

    serena
  • Java 虚拟机总结:垃圾回收机制

    前段时间定了个小目标,利用晚上的时间拜读大名鼎鼎的周志明的《深入理解 Java 虚拟机》,才看几章,“人民的名义”火起来了,唉,时间被强行夺了去,小目标眼睁睁的...

    serena
  • c++之类模板和函数模板的区别

    绝命生
  • Docker下实战zabbix三部曲之一:极速体验

    对于想学习和实践zabbix的读者来说,在真实环境搭建一套zabbix系统是件费时费力的事情,本文内容就是用docker来缩减搭建时间,目标是让读者们尽快投入z...

    程序员欣宸
  • MongoDB干货篇之查询数据

    爱撒谎的男孩
  • [Java] Java多线程的探索 -获取新闻标题

    最近研究了Java多线程的几种实现方式,写了这个项目用于练手。实现了通过多线程的方式获取人民日报的新闻标题(其实同时存了内容,但是我后续懒得处理了,毕竟这个项目...

    泰坦HW
  • 61-自定义异常

    凯茜的老爸
  • 详解YUV系列(一)----YUV444

    首先从文字叙述的角度来讲,这个格式相对比较简单一些,就是真对每一个像素都要分别采样Y, U, V的值。从物理存储的角度来讲,也就是每一个像素的表...

    视界音你而不同
  • Java后台生成二维码

    十毛

扫码关注云+社区

领取腾讯云代金券