django学习笔记(二)—— M层相关学习

1. M层

1.1 ORM简单介绍

ORM框架将对象的save(),update(),delete(),get()等方法生成所选数据库对应的增改删查语句,进而实现数据模型与数据库解藕。

1.2 django配置mysql

  • 在虚拟环境中创建新的项目
  • 修改配置文件中数据库:
    django配置mysql.png
  • 手动创建数据库:create database test charset=utf8; (或者连接工具创建)
  • 创建应用booktest,报错:
    django使用mysql报错.png
  • 安装pymysql模块pip install pymysql
  • 在项目__ init __.py中添加:
    django配置mysql.png
  • 随后可成功创建app,将app注册到项目中。

1.3 使用

  • 创建模型:
    定义模型.png
  • 迁移
  • 查看表结构:
    表结构.png

    注意,默认值不在数据库层面,而是在django创建对象时有效。另外boolean类型的字段,对应表后类型为tinyint类型。

1.4 测试

  • 添加测试时数据
    insert into booktest_bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values ('射雕英雄传','1980-5-1',12,34,0), ('天龙八部','1986-7-24',36,40,0), ('笑傲江湖','1995-12-24',20,80,0), ('雪山飞狐','1987-11-11',58,24,0);
    insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values ('郭靖',1,1,'降龙十八掌',0), ('黄蓉',0,1,'打狗棍法',0), ('黄药师',1,1,'弹指神通',0), ('欧阳锋',1,1,'蛤蟆功',0), ('梅超风',0,1,'九阴白骨爪',0), ('乔峰',1,2,'降龙十八掌',0), ('段誉',1,2,'六脉神剑',0), ('虚竹',1,2,'天山六阳掌',0), ('王语嫣',0,2,'神仙姐姐',0), ('令狐冲',1,3,'独孤九剑',0), ('任盈盈',0,3,'弹琴',0), ('岳不群',1,3,'华山剑法',0), ('东方不败',0,3,'葵花宝典',0), ('胡斐',1,4,'胡家刀法',0), ('苗若兰',0,4,'黄衣',0), ('程灵素',0,4,'医术',0), ('袁紫衣',0,4,'六合拳',0);
  • 视图:
    定义视图.png
  • url配置:
    url包含.png
    url配置.png
  • 模板配置和定义:
    模板配置
    模板定义.png
  • 结果:
    页面效果.png

1.5 属性定义

  • 格式:属性名=models.字段类型(选项)
  • 未设置任何属性为主键列是,django创建自动增长的主键列,属性名默认是id;
  • 属性名不能有连续的下划线,这由django的查询方式决定;
  • 字段类型:
    • AutoField:不指定时django默认添加名称为id的自增主键列,指定某属性后不再自动创建;
    • BooleanField:布尔类型,值为True或者False;
    • NullBooleanField:支持Null,True,Flase三种值;
    • CharField(max_lenhth=字符长度):字符串
      • 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:更新时间
      • auto_now_add:创建时间,二者不能同时为True
    • TimeField:时间,参数同DateField;
    • DateTimeField:日期时间,参数同DateField;
    • FileField:上传文件字段;
    • ImageField:继承于FileField,对上传文件进行校验,确保是有效的图片。
  • 选项:
    • null:True表示允许为空,默认False;
    • blank:True表示允许字段为空白,默认为False;
    • db_column:字段名称,若为指定,则使用属性名;
    • db_index:True表示该列创建索引,默认为False;
    • default:默认值;
    • primary_key:True表示该字段为主键字段,一般作为AutoField的选项使用,默认为False;
    • unique:True表示该字段在表中为唯一值,默认False;

1.6 字段查询

django查询一般使用:filter(), get(), exclude()。语法为:属性名__比较运算符=值(双下划线)。

1.6.1 条件运算符
    1. 等于查询:exact
    • list = BookInfo.objects.filter(id__exact=1)简写为:
    • list = BookInfo.objects.fileter(id=1)
    1. 模糊查询:contains, startswith, endswith
    • list = BookInfo.objects.filter(btitle__contains='西') # 要查询‘%’也无需转义
    • list = BookInfo.objexts.filter(btitle__endswith='记')

    上面运算符区分大小写,若不区分,用iexact, icontains, istartswith, iendswith

    1. 空查询:isnull
    • list = BookInfo.objects.filter(btitle__isnull=False)
    1. 范围查询:in
    • list = BookInfo.objects.filter(id__in=[1, 2, 3])
    1. 比较查询:gt, lt, gte, lte
    • list = BookInfo.objects.filter(id__gt=3)
    1. 不等于:exclude
    • list = BookInfo.objects.filter(id__exclude=3) # id不等于3的书
    1. 日期查询:year, month, day, week_day, hour, minute, second
    • list = BookInfo.objects.filter(bpub_date__year=1980) # 查询1980年发表的图书
    • list = BookInfo.objects.filter(bpub_date__gt=date(1980, 1, 1)) # 1980.1.1后发表的图书
1.6.2 F对象

上述查询为字段与常量值比较,两个字段比较可以使用F对象。F对象支持算数运算。

  • from django.db.models import F
  • list = BookInfo.objects.filter(bread__gt=F('bcomment')) # 查询阅读量大于评论量的图书
  • list = BookInfo.objects.filter(bread__gt=F('bcomment')*2) # 查询阅读量大于2倍评论量的图书
1.6.3 Q对象

多个过滤器逐个调用表示逻辑与关系,也可以条件处使用逗号拼接。如:

  • list = BookInfo.objects.filter(bread__gt=20, id__lt=10)等价于:
  • list = BookInfo.objects.filter(bread__gt=20).filter(id__lt=10)

要实现逻辑或,使用Q对象。Q对象语法:

  • Q(属性名__运算符=值),多个Q对象使用&表示与,使用|表示或,Q对象前面使用~表示非。
  • from django.db.models import Q
  • list = BookInfo.objects.filter(Q(bread__gt=20)) # 查询阅读量大于20的图书
  • list = BookInfo.objects.filter(Q(bread__gt=20) | Q(id__lt=10))
  • list = BookInfo.objects.filter(~Q(pk=3)) # 查询id不为3的图书。pk为主键的别名,即primary_key。
1.6.4 聚合函数

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

  • from django.db.models import Sum
  • book_sum = BookInfo.object.aggregate(Sum('bread')) # 返回一个字典类型的对象,形式为:{'bread__sum': 126}
  • book_count = BookInfo.objects.aggregate(Count('id')) # 返回:{'id__count': 5}
  • 可以简写为:count_value = BookInfo.objects.count() # 但是此时返回的是一个数字

1.7 查询集

  • 返回查询集的过滤器有:
    • all()
    • filter()
    • exclude()
    • order_by()
  • 返回单个值的过滤器有:
    • get():
      • 如果未找到,报“模型类.DoesNotExist”异常;
      • 如果找到多条,报“模型类.MultipleObjectsReturned”异常;
    • count():返回总条数;
    • aggregate():返回一个字典。
  • 返回查询集中是否有数据:
    • exist():True表示有数据,False表示没有数据。
  • 注意,django访问数据库有一特性惰性执行,即:创建查询集并不会访问数据库,只有调用数据时,才会访问数据库。
  • 限制查询集:可以对查询集进行取下标和切片操作,等同于mysql中limit使用。对查询集切片后返回一个新的查询集,但不会立即执行查询。使用:
    • list = BookInfo.objects.all()[0:2] # 获取前两项
    • 如果获取第一个对象,使用[0],等同于[0:1].get(),但如果没有数据,[0]引发IndexError异常,[0:1].get()引发DoesNotExist异常。
  • 惰性执行验证:
  • linux虚拟机下载anaconda和pycharm,创建bookmanager项目和booktest应用,创建BookInfo模型。打开mysql操作日志:
    修改ubuntumysql日志配置.png

    在shell中执行list = BookInfo.objects.all()创建查询集是并未访问数据库,而在执行list[0]时查询:
    访问数据库时机.png
1.8 模型类关系
  • ForeignKey:一对多,字段定义在多的一端;
  • ManyToManyField:多对多,字段定义在任意端;
  • OneToOneField:一对一,字段定义在任意端;
  • 自关联;
  • 一对多关系
    • 一到多的访问:一对应模型类对象.多对应模型类名小写_set
      • b = BookInfo.objects.get(pk=1)
      • herolist = b.heroinfo_set.all()
    • 多到一的访问:多对应模型类对象.属性名
      • hero = HeroInfo.objects.get(id=1)
      • book = hero.hbook
    • 多获取一对象ID:多对应模型类对象.属性名_id
      • book_id = hero.hbook_id
    • 多关联查询一:多类名小写__多类属性名__条件运算符=值
      • booklist= BookInfo.objects.filter(bookinfo__bcomment__contains='八')
    • 一关联查询多:关联属性名__一类属性名__条件运算符=值
      • herolist = HeroInfo.objects.filter(hbook__btitle__contains='部')
  • 一对一关系
    • 一对一关联查询返回的也是结果集
    • 一对一中没有类名小写_set属性
  • 多对多关系
    • 多对多建立表后会自动创建中间表
      多对多模型类.png
      多对多表.png
      多对多表结构.png
  • 自关联
自关联模型类定义.png
视图.png
URL.png
省模板.png
信息页模板.png
省页面.png
信息页页面.png

1.9 模型类管理器

模型类管理器是django和数据库交互的接口,是model.Manager类型的对象。定义模型时如果没有定义模型类管理器,django自动创建一个名为objects的管理器,如果有自定义,则不再自动创建。自定义管理器的语法为:

自定义模型类管理器.png
自定义后打开shell执行book = BookInfo.objects.get(id=1)时报错:
Snip20190703_114.png
自定义管理器主要有两种使用方法:

  • 重写all方法
  • 向管理器中添加额外的方法,比如添加数据方法
  1. 重写all方法:
    自定义管理器.png
    模型类中使用自自定义管理器.png
  2. 在管理器中定义创建对象的方法:
    自定义方法.png
    调用自定义方法:book = BookInfo.bookmanager.create_book('水浒传', date(1980, 1, 1))

2.0 元选项

在模型类中定义Meta,用于设置元信息,如设置db_table自定义表名。django创建表的默认表名为应用名_模型名

定义Meta类.png
Meta类修改表名.png

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

推荐阅读更多精彩内容