ORM框架介绍

对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

Python中的类 ---> 表

Python里面的类属性 ---> 字段

python 里面的类对象 --->  数据库表里的1条数据

我们是面向对象的。当对象的信息发生变化的时候,我们就需要把对象的信息保存在关系数据库中。程序员会在自己的业务逻辑代码中夹杂很多SQL语句用来增加、读取、修改、删除相关数据,而这些代码通常都是重复的。

ORM的出现充当了对象和数据库层次的桥梁作用。

优点:

提高我们的开发效率

开发人员技术参差不齐,大神写的sql优化非常好

缺点:

查询效率受影响 关系数据库技能退化

Django步骤

要想一个页面展示在用户面前

1.打开浏览器,输入网址,发起请求

2,接受请求 ,响应内容

-url要配置---> 将来 浏览器,输入的路径

url(r'^index/')

https://127.0.0.1:8000/index

-视图要写---> 用户输入 网址之后调用的内容

def index(request):

    return render(request,'index.html')

def + 视图函数的函数名称  第一个参数 是request

render 返回一个模板 (request,html)

3. 模型  models.py 这个模块   mvt

django给我们提供了一个orm框架

因为有了这个框架 我们可以不需要去写各种 sql语句

orm   类---> 表  属性对应--->字段  实例对象--->1行数据

属性类型

当前选择的数据库支持字段的类型

渲染管理表单时使用的默认html控件

在管理站点最低限度的验证 django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。

默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。

字段类型

AutoField:自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。(必须填入参数primary_key=True)

BooleanField:布尔字段,值为True或False。

NullBooleanField:支持Null、True、False三种值。

CharField(max_length=字符长度):字符串。

映射到数据库会是varchar

参数max_length表示最大字符个数。

TextField:大文本字段,一般超过4000个字符时使用。

IntegerField:整数。

DecimalField(max_digits=None, decimal_places=None):十进制浮点数。

参数max_digits表示总位数。

参数decimal_places表示小数位数。

FloatField:浮点数。

DateField[auto_now=False, auto_now_add=False]):日期。

参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。

参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。

参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。

TimeField:时间,参数同DateField。

DateTimeField:日期时间,参数同DateField。

FileField:上传文件字段。

ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片。

选项 约束

null:如果为True,表示允许为空,默认值是False。

blank:如果为True,则该字段允许为空白,默认值是False。

对比:null是数据库范畴的概念,blank是表单验证范畴的。

db_column:字段的名称,如果未指定,则使用属性的名称。

db_index:若值为True, 则在表中会为此字段创建索引,默认值是False。

default:默认值。

primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。

unique:如果为True, 这个字段在表中必须有唯一值,默认值是False。

4. 不用sqllite 我们使用mysql

如何去配置我们的mysql

4.1 settings.py DATABASE

DATABASES = { 'default': { 'ENGINE':'django.db.backends.mysql',# 数据库类型

'NAME': 'test1',# 数据库的名称,django不会直接给我们创建数据库需要我们手动创建

'USER': 'root',#数据库用户

'PASSWORD': '123456',# 数据库密码

'HOST': '127.0.0.1', 'PORT': '3306',# 端口号 } }

4.2 我们需要安装一个 python连接mysql的驱动  pymysql

4.3 我们需要把这个驱动 添加到项目里面来

项目下的__init__文件里:

import pymysql

pymysql.install_as_MySQLdb()

5. 设计完python的类(表) 不意味着 数据库里面就有这张表

5.1  生成迁移文件

python manage.py makemigrations

5.2  执行迁移

python manage.py migrate 

同步到数据库,创表成功,可以插入数据

6. 查询

6.1 查询 id=1 的书 =  excat

list = BookInfo.objects.filetr(id=1)

list = BookInfo.objects.filetr(id__exact=1)

mysql日志:

配置:

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

然后执行

sudo service mysql restart

使用如下命令打开mysql日志文件。

sudo tail -f /var/log/mysql/mysql.log

条件查询

1.判等 ------>   exact

2.模糊查询 ----->  contains

    查询以指定值开头 -----> startswith

    查询以指定值结尾 ------>  endswith  

3.空值查询  ---->  isnull (是否为null)

4.范围查询 ------>   in (是否包含在范围内)

5.比较查询 ----->  gt、gte、lt、lte:大于、大于等于、小于、小于等于。

6.日期查询 ---- >year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。

F对象和Q对象

查询两个属性的比较会使用F对象。

多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。

如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。

聚合函数

使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg,Count,Max,Min,Sum,被定义在django.db.models中。

aggregate的返回值是一个字典类型

使用count时一般不使用aggregate()过滤器。

注意count函数的返回值是一个数字。

查询集

返回查询集的过滤器如下:

all():返回所有数据。

filter():返回满足条件的数据。

exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字。

order_by():对结果进行排序。

返回单个值的过滤器如下:

get():返回单个满足条件的对象

count():返回当前查询结果的总条数。

aggregate():聚合,返回一个字典。

判断某一个查询集中是否有数据:

exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。

查询集两大特性

惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用。

缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后把结果缓存下来,再次使用这个查询集时会使用缓存的数据。

限制查询集

可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。不支持负数索引。

对查询集进行切片后返回一个新的查询集,不会立即执行查询。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容