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 条评论
登录 后参与评论

相关文章

来自专栏同步博客

浅谈PHP异常处理

  PHP中的异常的独特性,即PHP中的异常不同于主流语言C++、java中的异常。在Java中,异常是唯一的错误报告方式,而在PHP中却不是这样,而是把所有不...

633
来自专栏代码世界

Flask之wtforms

WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。

763
来自专栏人工智能LeadAI

用Python使用C语言程序(Windows平台)

前言 在机器学习中,很多时候我们需要Python和C的混合编程,最重要的原因是为了性能效率的提升: 解释型语言一般比编译型语言慢,一般提高性能的有效做法是,先做...

3614
来自专栏抠抠空间

Flask之WTForms

WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。

833
来自专栏Python小屋

使用with关键字让你的Python代码更加Pythonic

首先解释一下上一篇文章Python科学计算扩展库numpy中的广播运算中最后的小题目,该题目答案是一个元组(True, 5),原因在于Python中的等号=虽然...

3408
来自专栏抠抠空间

网络爬虫之scrapy框架详解

Twisted是用Python实现的基于事件驱动的网络引擎框架,scrapy正是依赖于twisted,

784
来自专栏代码世界

Flask之wtforms

WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。

1135
来自专栏jeremy的技术点滴

ansible简易入门之playbook

2734
来自专栏编程

身为程序猿,怎能不懂RegExp?

正则表达式是程序猿的好朋友。这体现在两个方面:一、在我们敲的代码里面,可以用正则表达式非常轻巧、灵便、快捷的完成字符串的操作,比如匹配、搜索、提取子串等。二、我...

1905
来自专栏AhDung

【手记】.net正则行尾匹配符$的问题

本来想用正则Split一下sql语句中简单场景的的GO,于是用^GO$(配合忽略大小写和多行模式),可居然连这种情况都搞不掂:

784

扫码关注云+社区