我的django之旅(三)模型和数据库

标签(空格分隔):模型 数据库 ORM


1.django ORM

django内置了一套完整的解决方案,其中就包括他自己的ORM。可惜没有使用SQLAlchemy,SQLAlchemy虽然学习曲线比较高,但基本上是python-orm的标准了,是不可避免的。ORM,全称(Object-Relationship-Mapping),对象关系映射。在MVC方式的开发中,Model代表数据模型,当我们使用数据库时不免要和SQL打交道。既然是面向对象编程,那么orm提供了一种新的方式和数据库打交道,每个数据模型实例都对应着数据库中的一行数据,对对象的操作就是对数据库中数据的操作

ps:ORM和传统操作相比,效率低了很多,为什么我们要使用orm呢?

还记得曾经看过一本书《黑客与画家》,里面有一章令我印象深刻。大意是:关于互联网创业,最重要的是先做一个产品出来,尽快上线,什么密码修改,密码找回这些功能全部不要管。为什么?因为我们最主要的目的是发掘市场,当一个产品发布后,看看他能产生多大的影响,一个没有市场的产品,纵然做得尽善尽美也没用。后期再把有市场的产品不断迭代做好。

ORM虽然操作效率低,但是开发效率高,避免出错。相比使用传统地数据库操作方式,能有效地缩减开发周期。

2.配置我们的数据库

使用orm框架的好处之一就是,无论我们使用哪种数据库都可以做到很好的迁移。因为不同数据库的sql语法有一定的差别。通过配置,我们就可以轻松使用不同的数据库

查看settings.py文件:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}

这里配置的是sqlite数据库系统,sqlite麻雀虽小,五脏俱全,作为开发我们完全可以使用它。但是它也有自己的缺陷,sqlite并不是一个client/server的数据库,缺乏解决大型项目问题的能力,正如sqlite开发者自己所言,他们只是和fopen()竞争。一个访问量10K/day的网站完全可以使用sqlite,比如个人博客网站。

所以我使用的是mysql数据库,原因如下:免费,好安装,国内大多数企业都在用它。

mysql的配置如下:

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}

mysql的端口号是3306

使用mysql的时候会报错:no moudle named "MySQLdb",这是因为我们没有安装这个包

sudo apt-get install python-dev
pip install MySQL-python

3.创建数据模型

模型其实就是一个python类,使用java开发就是java类etc。模型的存放地点是我们的应用的models.py文件中。每个模型都要继承models.Model类

class Category(models.Model):
name=models.CharField(max_lenth=128,unique=True) def __unicode__(self):
return self.name class Page(models.Model):
category=models.ForeignKey(Category)
title=models.CharField(max_lenth=128)
url=models.URLField()
views=models.IntegerField(defautl=0) def __unicode__(self):
return self.title

第二个类中的foreignKey字段包含了category,说明category是外键。有个奇怪的地方,当我们设计数据库表的时候,隐含的表明我们必须设计一个与数据不相关的ID字段,通常设为自增长,作为我们的主键。可是这里却没有,别慌,django十分善意,已经自动给我们设计了一个自动增长的id字段。

4.数据库迁移

当我们修改了模型的字段,往往意味着数据库中的表字段也要改变,这时候就需要用到数据库迁移了。django1.7以上版本提供了一个数据库迁移的工具。

执行命令:

python manage.py makemigrations
python manage.py migrate

每当我们对模型进行了修改或者是添加新的模型,都需要通过 _python manage.py makemigrations_命令进行注册

但是光是注册还不能真正将修改应用到数据库中,需要_python manage.py migrate_命令在数据库中修改表字段或新建表。

5.在shell中操作model

shell是外壳的意思,windows中有cms,powershell,linux下自带shell,是我们敲命令的地方。

在命令行直接输入python,肯定不能够操作我们的models,必须通过这个命令

python manage.py shell

操作如下:

>>> from rango.models import Category
>>> print Category.objects.all()
[]
>>> c=Category(name='test')
>>> c.save()
>>> print Category.objects.all()
[<Category: test>]

在这组操作中我们新建了一个Category实例,并将他保存起来。

6.超级用户

(1)超级用户(super user).django内置了许多的应用,其中有一个应用可以让我们方便地管理后台,只需简单的几行代码就可以了。

python manage.py createsuperuser

运行我们的项目,进入http://127.0.0.1:8000/admin/可以看到我们的管理后台已经生成了,但是没有我们项目中的模型,也就是还不能管理我们自己的数据。

(2)配置应用中的admin.py文件

注册数据模型

from rango.models import Category, Page

admin.site.register(Category)
admin.site.register(Page)

再刷新页面,就可以看到我们的模型了,可以对数据增删改查。这个功能简直惊为天人,也是我觉得django最好用的地方之一。

注意:要记住密码和账号

7.批量生成测试数据

如果我们在一个开发团队中,可能每个人都必须在自己的工程上,输入不同的测试数据,那么django非常贴心的提供了一个功能。可以自动生成测试数据,那么团队中的每个开发者都可以得到相同的测试数据了。

在项目目录下也就是和static,templates等同级目录下,新建一个python文件populate_rango.py。在文件中添加代码

add_page(cat=python_cat,
title="How to Think like a Computer Scientist",
url="http://www.greenteapress.com/thinkpython/") add_page(cat=python_cat,
title="Learn Python in 10 Minutes",
url="http://www.korokithakis.net/tutorials/python/") django_cat = add_cat("Django") add_page(cat=django_cat,
title="Official Django Tutorial",
url="https://docs.djangoproject.com/en/1.5/intro/tutorial01/") add_page(cat=django_cat,
title="Django Rocks",
url="http://www.djangorocks.com/") add_page(cat=django_cat,
title="How to Tango with Django",
url="http://www.tangowithdjango.com/") frame_cat = add_cat("Other Frameworks") add_page(cat=frame_cat,
title="Bottle",
url="http://bottlepy.org/docs/dev/") add_page(cat=frame_cat,
title="Flask",
url="http://flask.pocoo.org") # Print out what we have added to the user.
for c in Category.objects.all():
for p in Page.objects.filter(category=c):
print "- {0} - {1}".format(str(c), str(p)) def add_page(cat, title, url, views=0):
p = Page.objects.get_or_create(category=cat, title=title)[0]
p.url=url
p.views=views
p.save()
return p def add_cat(name):
c = Category.objects.get_or_create(name=name)[0]
return c # Start execution here!
if __name__ == '__main__':
print "Starting Rango population script..."
populate()

运行文件

python populate_rango.py

文件,数据就已经被写入数据库了。进入admin页面即可查看

8.总结

(1)在settings.py文件中配置需要连接什么数据库

(2)在应用的models.py中创建模型

(3)在admin.py中注册我们的model

(4)将模型映射到数据库

python manage.py makemigrations
python manage.py migrate

(5)通过populate脚本,向数据库中添加数据

(6)运行程序,在admin页面中查看,发现数据已经添加到数据库中了。

我的django之旅(三)数据库和模型的更多相关文章

  1. Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍

    创建一个 Django 项目及应用 django-admin startproject orm cd orm python manage.py startapp app01 在 models.py 上 ...

  2. 我的django之旅(四)模型,模板和视图

    一.结合模型,视图和模板 1.数据和模板结合 基本工作流程: (1)在views.py文件中导入我们创建的models (2)在视图函数中使用models,进行crud操作. (3)将取得的数据存入t ...

  3. Django进阶(三)

    ORM 众所周知有很多不同的数据库系统,并且其中的大部分系统都包含Python接口,能够让我们更好的利用它们的功能,而这些系统唯一的缺点就是需要你了解SQL,如果你是一个更愿意操纵Python对象,而 ...

  4. 循序渐进Python3(十二) --2--  web框架之django简单实现oracle数据库操作

    在 Django 中构建 Oracle 数据库支持的 Web 应用程序 了解如何配置 Django 以便与 Oracle 数据库交互,并使用 ORM 进行数据库连接.             产能在软 ...

  5. Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置

    近期做那个python的开发,今天就来简单的写一下开发路线的安装及配置, 开发路线 Python3.6.1+Pycharm5.0.6+Django1.11+MySQL5.7.18 1-安装Python ...

  6. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息

    1.1. mysql数据库连接池使用(三)数据库元数据信息反射数据库获取数据库信息 有时候我们想要获取到数据库的基本信息,当前程序连接的那个数据库,数据库的版本信息,数据库中有哪些表,表中都有什么字段 ...

  7. (转载)Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置

    近期做那个python的开发,今天就来简单的写一下开发路线的安装及配置, 开发路线 Python3.6.1+Pycharm5.0.6+Django1.11+MySQL5.7.18 1-安装Python ...

  8. Django学习笔记之数据库-模型的操作

    模型的操作 在ORM框架中,所有模型相关的操作,比如添加/删除等.其实都是映射到数据库中一条数据的操作.因此模型操作也就是数据库表中数据的操作. 添加模型 添加模型到数据库中.首先需要创建一个模型.创 ...

  9. 潭州课堂25班:Ph201805201 django 项目 第三课 码云注册,django项目 (课堂笔记)

    d码云注册,登录, 创建项目: 生成秘钥 想看秘钥: 添加公钥 复制 ssh 连接 通过  git clone <ssh> 连接 在服务器上创建 python3 虚拟环境, 创建项目  p ...

随机推荐

  1. 左右推拽显示对比图 - jQyery封装 - 附源文件

    闲来无事,做了一个模块效果 左右拖拽显示对比图,是用jq封装的 利用鼠标距离左侧(0,0)坐标的横坐标位移来控制绝对定位的left值 再配合背景图fixed属性,来制作视觉差效果 代码如下 <! ...

  2. JavaScript中var a=b=c=d的小发现

    看了别人的博客随手记录下 先看一下以下的代码 var a=1,b=2,c=3; (function(){ var a=b=1; })(); console.log(a); console.log(b) ...

  3. linux 常用压缩工具快速指南

    .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) ——————————————— .gz 解压 ...

  4. 让Mac OS X中的PHP支持GD

    GD库已经是近乎于是现在主流PHP程序的标配了,所以也必须让Mac OS X中的PHP支持GD.在网上搜索了好多,最终按照这个方式成功实现,如何让Mac OS X支持PHP,请查看<让PHP跑在 ...

  5. C程序设计语言练习题1-12

    练习1-12 编写一个程序,以每行一个单词的行驶打印其输入. 代码如下: #include <stdio.h> // 包含标准库的信息. int main() // 定义名为main的函数 ...

  6. GO函数倒叙输出

    package main import "fmt" func main(){ rec() } func rec(i int){ { return } rec(i+) fmt.Pri ...

  7. Keil C51 vs 标准C

    深入理解并应用C51对标准ANSIC的扩展是学习C51的关键之一.因为大多数扩展功能都是直接针对8051系列CPU硬件的.大致有以下8类: 8051存储类型及存储区域 存储模式 存储器类型声明 变量类 ...

  8. 在Visual Studio 2013中编译libssh2项目

     一. 下载需要的外部包,并解压,下面给出的链接如果无法访问,就google搜索下载一下: •下载openssl •下载zlib 二.修改libssh2项目配置: 1.C/C++->Gene ...

  9. eclipse3.7 安装maven插件与scm

    转自:http://blacksonny.iteye.com/blog/1900275 最近要使用maven进行开发,之前的eclipse3.7 使用一下两个地址安装好了插件,如下: maven插件 ...

  10. <php>删除(有内容的)文件夹函数程序

    function deldir($dirname) { if(!file_exists($dirname)) {//判断文件夹是否存在 die("文件夹不存在!");//作用等于( ...