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

相关文章

来自专栏我的博客

XML转成Json,数组转成Json,Json转成数组

1、数据交互经常用到XML或者Json,其中Json数据居多(优点不多说) 2、ZendFrameWork中如何将XML转换成Json以及数组和Json转换 直...

2939
来自专栏小狼的世界

Logstash中如何处理到ElasticSearch的数据映射

Logstash作为一个数据处理管道,提供了丰富的插件,能够从不同数据源获取用户数据,进行处理后发送给各种各样的后台。这中间,最关键的就是要对数据的类型就行定义...

2932
来自专栏mySoul

cookie

除了名(name)和值(value),cokie持续有效时间很短,只能持续在web浏览器的会话期间。一旦用户关闭浏览器,用户保存的数据就全部丢失。cookie需...

762
来自专栏大内老A

WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[下篇]

WCF客户端和服务端的框架体系相互协作,使得开发人员可以按照我们熟悉的方式进行异常的处理:在服务操作执行过程中抛出异常(FaultException),在调用服...

1779
来自专栏Python攻城狮

Python操作redis1.python操作redis2.实例3.Redis缓存Mysql模拟用户登录,Python实现实例

1 .用户登录首先判断是否在redis缓存中,如果在redis缓存中,直接登录成功; 2 .若用户未在redis缓存,则访问Mysql,判...

993
来自专栏Coding迪斯尼

java开发操作系统:同时运行多窗口多任务

1015
来自专栏大内老A

[WCF权限控制]利用WCF自定义授权模式提供当前Principal[原理篇]

在《通过扩展自行实现服务授权》一文中,我通过自定义CallContextInitializer的方式在操作方法之前之前根据认证用户设置了当前线程的安全主体,从而...

1808
来自专栏安恒网络空间安全讲武堂

Python编写渗透工具学习笔记一 | 0x03用多线程扫描某一网段中存活的主机

0x03用多线程扫描 某一网段中存活的主机 (如果渗透进了内网,还可以扫描内网上里的存活主机) 脚本利用演示+实现思路分析 实现思路: 调用终端执行ping命令...

22210
来自专栏游戏杂谈

设置Flex中Tree组件默认选中一项

项目中需要用到tree这个组件,但我在做产品的过程中想让程序默认选中tree组件中的某一节点。之前用到的flex的sdk是3.4版本,在使用selectIte...

745
来自专栏linux驱动个人学习

VFS四大对象之二 struct inode

继上一篇文章:https://cloud.tencent.com/developer/article/1053842 二、inode结构体:(转自http://...

4677

扫码关注云+社区