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配置,

1 默认的是:'ENGINE': 'django.db.backends.sqlite3',需要修改为mysql2 DATABASES ={3 'default': {4 'ENGINE': 'django.db.backends.mysql',5 'NAME': 'crm',6 'USER': 'root',7 'PASSWORD': 'qwe123',8 'HOST': '127.0.0.1',9 #POST官方推荐的是字符串。

10 'POST': '3306',11 }12 }

修改项目文件夹(和setting.py文件所在的目录)下的__init__.py文件

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

#在__init__文件中配置

1 importpymysql2

3 pymysql.install_as_MySQLdb()

设置时区

1 setting.py文件中设置时区2

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

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

定义模型

模型类必须写在app下的models.py文件中。

模型如果需要映射到数据库,所在的app必须被安装。

一个数据表对应一个模型类,表中的字段,对应模型中的类属性。

在models文件中创建模型:

1 from django.db importmodels2

3 #必须继承'models.Model'

4 classStudents(models.Model):5

6 #模型会自动创建主键,djiano会自动创建一个字段为'id'的主键。

7 id一般不用创建8

9 name = models.CharField(max_length=20)10 age = models.SmallIntegerField(default=0)11 sex = models.SmallIntegerField(default=1)12 qq = models.CharField(max_length=20, default='')13 phone = models.CharField(max_length=20, default='')14 c_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)15

16 #__str__代码是为了在ipython调试中方便查看数据,对数据库不造成任何影响,不用做数据库迁移

17 def __str__(self):18 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类型的,是因为字符串更好操作,不容易出错。

每一个模型都是django.db.models.Model的子类(类的继承)。

每个模型都有许多的类变量,它会表示模型中的数据库字段。

每一个字段都由一个字段类的实例来表示。

激活模型:

在项目中注册app

1 INSTALLED_APPS =[2 'teacher.apps.TeacherConfig',3 ]

运行数据库迁移命令(一定要在项目根目录下) 告诉django,我们做了哪些数据库的更改

'python manage.py makemigrations teacher'

#如果不写teacher这个,则是运行INSTALLED_APPS下面所有注册的app

>>> (django) pyvip@Vip:~/code/crm$ python manage.py makemigrations teacher

Migrationsfor '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 0001BEGIN;--

--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(小写)

运行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.00sec)

这里生成了两张表:

第一张表用来记录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.00sec)#此处表可以看到会根据我们的定义的模型来创建。

MySQL数据库的增删改查

django shell调试工具

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

进入到调试工具

>>>python manage.py shell

增加

#导入模型

#导入我们需要调试的数据模型

>>>from teacher.models import Students

查询模型中是否有数据

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

查询模型中的所有的值

>>>Students.objects.all()

#此时我们还未添加数据,所以此处为空

返回的值是QuerySet的一个查询集

第一种方式,创建一条数据

有default的不写默认是他自定的数据。>>>s1 = Students(name='小明', age=18, qq='123456')

需要保存才可以操作数据库>>>s1.save()

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

mysql> select * fromteacher_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.00sec)#这里创建的时间一定是UTC时间,因为项目会运行在不同的时区,取出来的时候再转换成当前时间就好了。

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

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

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

>>>Students.objects.all()]>

第二种方式,创建一条数据,一条一条插入数据

>>>s2 =Students()>>>s2.name = '小明'

>>>s2.age = 18

>>>s2.qq = '123456'

第三种方式,创建一条数据,直接操作数据库

>>>Students.objects.create(name='小明', age=18, qq='123456')

#返回查询集

第四种方式,先查,查了再创建

>>>Students.objects.get_or_create(name='小明')

(, False)#没有创建成功,数据存在返回查到的值

第一个元素代表模型对象,bool值代表是否创建,False代表没有创建是查询的。

查询

all方法

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

>>>Students.objects.all(), , , ]>

#我们添加一些数据后,用于查询出来的结果

查看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` LIMIT1 OFFSET 1

#通过切片的方式达到LIMIT的SQL语句

get方法

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

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

#如果给定的查询内容,可以匹配到多条数据,则会报错,get方法只能获取单挑且唯一的数据

pk:参数中pk代表主键

>>>Students.objects.get(pk=1)]>

#同样可以查询到,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中的配置

1 from teacher.models importStudents2

3 defindex(request):4 students = Students.objects.all()

对应的html中配置

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

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

python增删改查的框架_python的Web框架,Django的ORM,模型基础,MySQL连接配置及增删改查...相关推荐

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

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

  2. pyramid框架_Python Pyramid Web框架简介

    pyramid框架 在这个由四部分组成的系列文章的第一篇文章中,比较了不同的Python Web框架,我解释了如何在Flask Web框架中创建"待办事项列表" Web应用程序. ...

  3. python做性能测试框架_python常用web框架简单性能测试结果分享(包含dja

    测了一下django.flask.bottle.tornado 框架本身最简单的性能.对django的性能完全无语了. django.flask.bottle 均使用gunicorn+gevent启动 ...

  4. python django前端框架_Python的Web应用框架–Django

    一:简介 python的web框架有很多,个人查了一下,有Django.Pylons. Tornado.Bottle和Flask等,其中使用人数最多的是Django,而我学习Django也是因为ope ...

  5. python流行的爬虫框架_Python爬虫相关框架

    Python爬虫相关框架,Python的爬虫框架就是一些爬虫项目的半成品.比如我们可以将一些常见爬虫功能的实现代码写好,然后留下一些接口,在做不同的爬虫项目时,我们只需要根据实际情况,只需要写少量需要 ...

  6. python企业级框架_Python六大开源框架对比:Web2py略胜一筹

    Python是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准库也是值得大家称赞的,Python甚至还自带 ...

  7. python企业级框架_Python六大开源框架对比:Web2py略胜一筹(转)

    Python是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准库也是值得大家称赞的,Python甚至还自带 ...

  8. python api测试框架_python api 测试框架

    python常用框架 Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是 ...

  9. python flask框架是什么_Python三大web框架分别是什么 哪个更好

    展开全部 [导读]目前,Python比较2113火的三大5261web框架有Django.Flask和Tornado,要论这三个Web框架哪个更好4102的话,建议一点1653,Django帮我们事先 ...

最新文章

  1. 如何禁止NumPy自动跳过数组的中心部分并仅打印角点
  2. 有负权重边的图可以有拉普拉斯矩阵吗?
  3. Python源码剖析[16] —— Pyc文件解析
  4. 2020-10-19 Keil安装及使用
  5. RxJava中BehaviorSubject适合的使用场景
  6. 数据结构基础:算法的基础知识笔记
  7. Java文件类boolean setExecutable(boolean exec_file,boolean owner_access)方法,带示例
  8. stm32c语言设计以及注释,13个基于STM32的经典项目设计实例,全套资料~-嵌入式系统-与非网...
  9. codeforces B. Strongly Connected City(dfs水过)
  10. html键盘事件监听,react怎样监听键盘事件
  11. CentOS7.2中使用Kubernetes(k8s)1.4.6源码搭建k8s容器集群环境
  12. PDMS Pipeline Tool 教程(三):材料表
  13. 远控免杀专题10--TheFatRat免杀
  14. 墨卡托投影原理及瓦片公式推导
  15. 最新微软产品MAK激活密钥
  16. 【自习自习自习自习自习】
  17. ios 开发 flurry 资料
  18. 【宇麦科技】某新能源企业的群晖nas存储方案:让“海量数据”跑出“加速度”
  19. DirectX 性能优化
  20. iOS 中将数据导出成Excel文件 ---- libxlsxwriter框架

热门文章

  1. SpringCloud系列十二:SpringCloudSleuth(SpringCloudSleuth 简介、SpringCloudSleuth 基本配置、数据采集)...
  2. Qt5: SpringAnimation
  3. linux下C++ 插件(plugin)实现技术
  4. 关于我的51CTO博客
  5. 2010-08-22 动漫店 员工卡缓存出现问题。
  6. IBM 365服务器安装serverraid-7k控制器
  7. SpringCloud Eureka Client和Server侧配置及Eureka高可用配置
  8. 拷贝构造函数的第一个参数必须是自身类类型的引用
  9. 【转】select和epoll模型的差异
  10. PHP中的字符串 — 表示方法