Django中的ORM简介

ORM概念:对象关系映射(Object Relational Mapping,简称ORM):

用面向对象的方式描述数据库,去操作数据库,甚至可以达到不用编写SQL语句就能够对数据库进行增删改查,进行各种操作。我们只需要对python的面向对象熟悉,就可以很清晰的知道各种数据之间的关系。

django模型映射关系:


数据库连接配置

Django支持主流的数据库,都有配置,在setting中配置即可,下面我们看下如何配置MySQL。

db.sqlite3文件的说明

db.sqlite3文件也是数据库文件,Django默认情况下,会配置这个文件,这个文件很小,很多单机、net的用的是这个

Django 连接MySQL的配置流程:

  • 安装 pymysql,用于python操作mysql数据库
pip install pymysql
  • 创建数据库用户,需要有创建数据库权限的用户

  • 创建数据库

#进入数据库,此命令用的root账户。正常是用数据库管理员给的数据库账号
>>>(django) pyvip@Vip:~$ mysql -uroot -pqwe123

#创建一个叫crm的数据库
>>>mysql> create database crm;
Query OK, 1 row affected (0.00 sec)
  • 修改setting配置,
 默认的是:'ENGINE': 'django.db.backends.sqlite3',需要修改为mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'crm',
'USER': 'root',
'PASSWORD': 'qwe123',
'HOST': '127.0.0.1',
#POST官方推荐的是字符串。
'POST': '',
}
}
  • 修改项目文件夹(和setting.py文件所在的目录)下的__init__.py文件

因为历史原因,python2用的模块是MySQLdb这个模块,所以需要如此写。

#在__init__文件中配置
 import pymysql

 pymysql.install_as_MySQLdb()
  • 设置时区
  setting.py文件中设置时区

  TIME_ZONE = 'Asia/ShangHai'   #北京时间

模型的创建与映射(激活)

定义模型

  1. 模型类必须写在app下的models.py文件中。
  2. 模型如果需要映射到数据库,所在的app必须被安装。
  3. 一个数据表对应一个模型类,表中的字段,对应模型中的类属性。

在models文件中创建模型:

  from django.db import models

     #必须继承'models.Model'
class Students(models.Model): #模型会自动创建主键,djiano会自动创建一个字段为'id'的主键。
id一般不用创建 name = models.CharField(max_length=20)
age = models.SmallIntegerField(default=0)
sex = models.SmallIntegerField(default=1)
qq = models.CharField(max_length=20, default='')
phone = models.CharField(max_length=20, default='')
c_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True) #__str__代码是为了在ipython调试中方便查看数据,对数据库不造成任何影响,不用做数据库迁移
def __str__(self):
return '%s-%s' % (self.name, self.age)
    解析:
CharField:字符字段,必须提供max_length这个参数,CharField的defaul最好不要给None。
SmallIntegerField:int类型
max_length:长度
default:默认值,可以给'',如果不填,就是默认的。
auto_now_add=True 在创建对象的时候,自动把当前时间记录下来。
verbose_name:第一个位置参数,人类看的,如果没有提供这个字典,则直接使用它的变量 qq、phone给的CharField不用SmallIntegerField类型的,是因为字符串更好操作,不容易出错。
  1. 每一个模型都是django.db.models.Model的子类(类的继承)。
  2. 每个模型都有许多的类变量,它会表示模型中的数据库字段。
  3. 每一个字段都由一个字段类的实例来表示。

激活模型:

  1. 在项目中注册app
 INSTALLED_APPS = [
'teacher.apps.TeacherConfig',
]
  1. 运行数据库迁移命令(一定要在项目根目录下) 告诉django,我们做了哪些数据库的更改
'python manage.py makemigrations teacher'
#如果不写teacher这个,则是运行INSTALLED_APPS下面所有注册的app >>> (django) pyvip@Vip:~/code/crm$ python manage.py makemigrations teacher
Migrations for 'teacher':
teacher/migrations/0001_initial.py
- Create model Students

运行成功后,会生成一个数据库迁移文件

现在还没有真正的操作数据库

sqlmigrate,从迁移获取SQL语句

'python manage.py sqlmigrate teacher 0001'

>>>(django) pyvip@Vip:~/code/crm$ python manage.py sqlmigrate teacher 0001
BEGIN;
--
-- Create model Students
--
CREATE TABLE `teacher_students` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(20) NOT NULL, `age` smallint NOT NULL, `sex` smallint NOT NULL, `qq` varchar(20) NOT NULL, `phone` varchar(20) NOT NULL, `c_time` datetime(6) NOT NULL);
COMMIT; #创建的表名是:appname_模型name.lower(小写)
  1. 运行migrate命令,使迁移生效
#这里的teacher不写则默认生成所有的表
'python manage.py migrate teacher' >>>(django) pyvip@Vip:~/code/crm$ python manage.py migrate teacher
Operations to perform:
Apply all migrations: teacher
Running migrations:
Applying teacher.0001_initial... OK #执行了teacher.0001_initial这个里面的tables。

我们查看下是否创建了

>>>mysql> show tables;
+-------------------+
| Tables_in_crm |
+-------------------+
| django_migrations |
| teacher_students |
+-------------------+
2 rows in set (0.00 sec) 这里生成了两张表:
第一张表用来记录django的migrations
第二张表是我们需要的数据表

查看表结构:

>>>mysql> desc teacher_students;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| age | smallint(6) | NO | | NULL | |
| sex | smallint(6) | NO | | NULL | |
| qq | varchar(20) | NO | | NULL | |
| phone | varchar(20) | NO | | NULL | |
| c_time | datetime(6) | NO | | NULL | |
+--------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec) #此处表可以看到会根据我们的定义的模型来创建。

MySQL数据库的增删改查

django shell调试工具

在进入之前建议安装ipython(pip安装),使用会更方便

进入到调试工具
>>>python manage.py shell

增加

#导入模型
#导入我们需要调试的数据模型
>>>from teacher.models import Students

查询模型中是否有数据

objects是模型的一个属性(方法),object的管理器

>>>Students.objects
<django.db.models.manager.Manager at 0xb2e0fe0c>

查询模型中的所有的值

>>>Students.objects.all()
<QuerySet []> #此时我们还未添加数据,所以此处为空
返回的值是QuerySet的一个查询集
第一种方式,创建一条数据
有default的不写默认是他自定的数据。
>>>s1 = Students(name='小明', age=18, qq='') 需要保存才可以操作数据库
>>>s1.save()

是否创建成功了呢,我们在MySQL中查看一下

mysql> select * from teacher_students;
+----+--------+-----+-----+--------+-------+----------------------------+
| id | name | age | sex | qq | phone | c_time |
+----+--------+-----+-----+--------+-------+----------------------------+
| 1 | 小明 | 18 | 1 | 123456 | | 2019-02-26 08:04:57.955584 |
+----+--------+-----+-----+--------+-------+----------------------------+
1 row in set (0.00 sec) #这里创建的时间一定是UTC时间,因为项目会运行在不同的时区,取出来的时候再转换成当前时间就好了。

当前查看的all方式返回的是函数体类型的,不好查看,需要在模型代码中添加

 def __str__(self):
return '%s-%s' % (self.name, self.age)

再次查询的时候会变成格式化的样式

>>>Students.objects.all()
<QuerySet [<Students: 小明-18>]>
第二种方式,创建一条数据,一条一条插入数据
>>>s2 = Students()

>>>s2.name = '小明'

>>>s2.age = 18

>>>s2.qq = ''
第三种方式,创建一条数据,直接操作数据库
>>>Students.objects.create(name='小明', age=18, qq='')
<QuerySet: 小明-18> #返回查询集
第四种方式,先查,查了再创建
>>>Students.objects.get_or_create(name='小明')
(<Students: 小明-18>, False) #没有创建成功,数据存在返回查到的值
第一个元素代表模型对象,bool值代表是否创建,False代表没有创建是查询的。

查询

all方法

返回的是一个查询集,不是对象,没有操作数据库,可以查看到SQL语句

>>>Students.objects.all()
<QuerySet [<Students: 小明-18>, <Students: XiaoHong-16>, <Students: 王五-24>, <Students: 赵柳-22>]> #我们添加一些数据后,用于查询出来的结果

查看all语句的背后的操作,查看sql语句

>>>res = Students.objects.all()

>>>print(res.query)
SELECT `teacher_students`.`id`, `teacher_students`.`name`, `teacher_students`.`age`, `teacher_students`.`sex`, `teacher_students`.`qq`, `teacher_students`.`phone`, `teacher_students`.`c_time` FROM `teacher_students` #就相当于SQL语句: SELECT * FROM 'teacher_students'

切片方式

>>>res = Students.objects.all()

>>>print(res[1:2].query)
SELECT `teacher_students`.`id`, `teacher_students`.`name`, `teacher_students`.`age`, `teacher_students`.`sex`, `teacher_students`.`qq`, `teacher_students`.`phone`, `teacher_students`.`c_time` FROM `teacher_students` LIMIT 1 OFFSET 1 #通过切片的方式达到LIMIT的SQL语句
get方法

当我们的get匹配到多条数据的时候会报错。

>>>Students.objects.get(name='小明')
<Students: 小明-18> #如果给定的查询内容,可以匹配到多条数据,则会报错,get方法只能获取单挑且唯一的数据

pk:参数中pk代表主键

>>>Students.objects.get(pk=1)
<QuerySet [<Students: 小明-18>]> #同样可以查询到,pk代表主键
filter方法
>>>res = Students.objects.filter(sex=1)

>>>print(res.query)
SELECT `teacher_students`.`id`, `teacher_students`.`name`, `teacher_students`.`age`, `teacher_students`.`sex`, `teacher_students`.`qq`, `teacher_students`.`phone`, `teacher_students`.`c_time` FROM `teacher_students` WHERE `teacher_students`.`sex` = 1

修改

get方法

通过对象赋值的方法修改

>>>s = Students.objects.get(name='小明')

>>>s.age = 16

>>>s.save()
updata方法

通过查询到的数据进行修改,可以修改多条数据

>>>Students.objects.filter(name='小明').update(age=19)
1
#返回修改的条数

删除

delete方法

指定删除,通过对象查到数据,再删除对象

>>>s = Students.objects.get(pk=2)

>>>s.delete()
(1, ('teacher.Students': 1)) #返回的是一个元祖:删除的数量,表的名称,删除数量

删除多条

>>>Students.objects.filter(sex=1).delete()
(3, ('teacher.Students': 3))

数据库应用到模型中

views中的配置

 from teacher.models import Students

 def index(request):
students = Students.objects.all()

对应的html中配置

  1. 获取值的方式和字典的方式一样,不用再另外配置

下一篇内容:模型属性,及数据库进阶查询,请点击这里

python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查的更多相关文章

  1. 48.Python中ORM模型实现mysql数据库基本的增删改查操作

    首先需要配置settings.py文件中的DATABASES与数据库的连接信息, DATABASES = { 'default': { 'ENGINE': 'django.db.backends.my ...

  2. python操作三大主流数据库(2)python操作mysql②python对mysql进行简单的增删改查

    python操作mysql②python对mysql进行简单的增删改查 1.设计mysql的数据库和表 id:新闻的唯一标示 title:新闻的标题 content:新闻的内容 created_at: ...

  3. django之创建第8-1个项目-数据库之增删改查/数据库数据显示在html页面

    1.为test.DB数据库预先创建下面数据 1    张三    16    2015-01-02    12    李四    17    2015-01-04    13    王五    14  ...

  4. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  5. Python之Web框架Django

    Python之Web框架: Django 一. Django Django是一个卓越的新一代Web框架 Django的处理流程 1. 下载地址  Python 下载地址:https://www.pyt ...

  6. Python3.5学习十八 Python之Web框架 Django

    Python之Web框架: 本质:Socket 引用wsgiref创建web框架 根据web框架创建过程优化所得: 分目录管理 模板单独目录 执行不同函数单独存入一个方法py文件 Web框架的两种形式 ...

  7. django模型层 关于单表的增删改查

    关于ORM MTV或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库, 通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...

  8. django模型层之多表操作 增删改查

    多表操作之创建模型 这边以书为中心创建一个模型 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(on ...

  9. .NET ORM框架HiSql实战-第二章-使用Hisql实现菜单管理(增删改查)

    一.引言 上一篇.NET ORM框架HiSql实战-第一章-集成HiSql 已经完成了Hisql的引入,本节就把 项目中的菜单管理改成hisql的方式实现. 菜单管理界面如图: 二.修改增删改查相关代 ...

随机推荐

  1. SpringBoot小新手。

    2018-09-27 最近在学习SpringBoot:教材 先是在https://start.spring.io/下载了工程.demo.zip 下载之后,导入Eclipse工程,pom.xml里面的& ...

  2. SPARK安装三:SPARK集群部署

    使用2.3.0版本,因为公司生产环境是这个版本 一.下载安装 cd /opt wget https://archive.apache.org/dist/spark/spark-2.3.0/spark- ...

  3. Apache ab性能测试结果分析

    Apache ab性能测试结果分析 测试场景:模拟10个用户,对某页发起总共100次请求. 测试命令: ab -n 100 -c 10 地址 测试报告: Server Software: 被测服务器软 ...

  4. C#部分试题实例

    1.在C#中,下列选项中自定义方法的语句错误的是().(选择一项) 正确答案:AD 解析:本题考查自定义方法的定义及调用.A项void是无返回值类型,D项定义方法的时候没有写返回值类型:故选AD. 2 ...

  5. Nginx的rewrite应用

    Rewrite主要的功能是实现URL重写,Nginx 的 Rewrite 规则采用 PCRE Perl 兼容正则表达式的语法进行规则匹配,如相使用 Nginx 的 Rewrite 功能,在编译 Ngi ...

  6. Awesome Python 中文版

    Awesome Python ,这又是一个 Awesome XXX 系列的资源整理,由 vinta 发起和维护.内容包括:Web框架.网络爬虫.网络内容提取.模板引擎.数据库.数据可视化.图片处理.文 ...

  7. ActiveMQ_2安装

    Linux安装 环境JDK7以上 gz文件拷贝到 /usr/local/目录下 解压 后缀为 .tar.gz的压缩包 进入解压后的文件夹 cd apache-activemq-x.xx.x/ cd b ...

  8. Python序列结构

    python中常用的序列结构由列表.元组.字典.字符串.集合等,列表.元组.字符串等有序序列以及range对象均支持双向索引 是否有序 序列结构 是否是可变序列 有序序列 元组 不可变序列 有序序列 ...

  9. bootstrap的化妆页面

    Glyphicons 字体图标 所有可用的图标 包括260个来自 Glyphicon Halflings 的字体图标.Glyphi cons Halflings 一般是收费的,但是他们的作者允许 Bo ...

  10. SQL Server使用证书最小粒度授权

    最近在项目中某个功能遇到了阻塞造成的Time out错误.所以需要在执行该功能的时候开启一个线程检测SQL Server中阻塞会话.但是程序本身使用的sql帐号本身不具备VIEW Sever Stat ...