django 基础框架学习 (三)
Django框架基础-03
数据库新增数据
1.save⽅法
>>> from datetime import date
>>> from booktest.models import BookInfo, HeroInfo
>>> book = BookInfo(
... btitle='⻄游记',
... bpub_date=date(1989,1,1),
... bread=10,
... bcomment=20
... )
>>> book.save()
2.create⽅法
>>> HeroInfo.objects.create(
... hname='⽩⻰⻢',
... hgender=1,
... hcomment='被师傅',
... hbook=book
... )
3.⼀对多外键绑定
1.绑定模型对象 hbook=book
2.绑定模型对象id hbook_id=book.id
数据库查询数据
基本查询
1.查询单⼀结果
BookInfo.objects.get(id=3)
BookInfo.objects.get(btitle='⻄游记')
只能得到单⼀模型对象 多查了报错 没查到也报错 所以查询时必须try
2.⽆条件查询所有
BookInfo.objects.all()
得到的是查询集(QuerySet),直到真正使⽤数据时才会去查询数据库
3.查询数据表总量
BookInfo.objects.count()
BookInfo.objects.filter(btitle='⻄游记').count()
过滤查询
1.过滤查询语法 模型类.objects.过滤器(模型属性名__条件运算符=值)
2.过滤查询需求
1.查询id为1的书籍 BookInfo.objects.filter(id=1)
2.查询书名包含‘湖’的书籍 (like %湖%) BookInfo.objects.filter(btitle__contains='湖')
3.查询书名以‘部’结尾的书籍 (endswith 、startswith)(like %部)/(like 部%) BookInfo.objects.filter(btitle__endswith='部')
4.查询书名不为空的书籍(双重否定,代表肯定) BookInfo.objects.filter(btitle__isnull=False)
5.查询编号为2或4的书籍 (范围内,不代表区间) BookInfo.objects.filter(id__in=[2,4])
6.查询编号⼤于2的书籍 (lt ⼩于)(gt ⼤于)(lte ⼩于等于)(gte ⼤于等于) BookInfo.objects.filter(id__gt=2)
7.查询id不等于3的书籍 exclude(查询满⾜条件以外的数据) BookInfo.objects.exclude(id=3)
8.查询1980年发表的书籍 BookInfo.objects.filter(bpub_date__year='1980')
9.查询1990年1⽉1⽇后发表的书籍 BookInfo.objects.filter(bpub_date__gt=date(1990,1,1))
F对象和Q对象
1.F对象
1.查询阅读量⼤于评论量的书籍 BookInfo.objects.filter(bread__gt=F('bcomment'))
2.查询阅读量⼤于2倍评论量的书籍 BookInfo.objects.filter(bread__gt=F('bcomment')*2)
2.Q对象
1.查询阅读量⼤于20,或编号⼩于3的图书 BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
2.查询编号不等于3的书籍 BookInfo.objects.filter(~Q(id=3))
3.逻辑与
1.写法⼀
BookInfo.objects.filter(bread__gt= 20,id__lt=3 )
或
BookInfo.objects.filter(bread__gt= 20).filter(id__lt=3 )
2.写法⼆ BookInfo.objects.filter(Q(bread__gt= 20) & Q(pk__lt= 3 ))
聚合和排序
1.聚合
1.调⽤聚合函数的过滤器 aggregate()
2.聚合函数
聚合函数包括:Avg 平均,Count 数量,Max 最⼤,Min 最⼩,Sum 求和
定义在django.db.models中
3.语法 Sum('求和的模型类属性')
4.实现 BookInfo.objects.aggregate(Sum('bread'))
5.结果
{ '属性名__聚合类⼩写':值}
{ 'bread__sum': 136}
2.排序 BookInfo.objects.all().order_by('bread') # 升序
BookInfo.objects.all().order_by('-bread') # 降序
关联查询
1.基础关联查询
1.⼀查多:查询编号为1的图书中所有⼈物信息 book = BookInfo.objects.get(id=1)
book.heroinfo_set.all()
2.多查⼀:查询编号为1的英雄出⾃的书籍 hero = HeroInfo.objects.get(id=1)
hero.hbook
2.内连接查询
1.多查⼀:查询书籍中⼈物的描述包含"降⻰"的书籍 BookInfo.objects.filter(heroinfo__hcomment__contains='降⻰')
2.⼀查多:查询书名为"天⻰⼋部"的所有⼈物信息 HeroInfo.objects.filter(hbook__btitle='天⻰⼋部')
数据库修改和删除数据
1.修改
1.save⽅法
hero = HeroInfo.objects.get(hname= ' 猪⼋戒' )
hero.hname = ' 猪悟能'
hero.save()
2.update⽅法 HeroInfo.objects.filter(hname= ' 沙悟净' ).update(hname= ' 沙僧' )
2.删除
hero = HeroInfo.objects.get(id=1 )
hero.delete()
HeroInfo.objects.filter(id=1 ).delete()
数据库查询集
1.概念 查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
2.获取查询集
• all():返回所有数据。
• filter():返回满⾜条件的数据。
• exclude():返回满⾜条件之外的数据。
• order_by():对结果进⾏排序。
3.对查询集可以再次调⽤过滤器进⾏过滤 BookInfo.objects.filter(bread__gt= 30).order_by(' bpub_date' )
4.两⼤特性
1.惰性执⾏
创建查询集不会访问数据库,直到调⽤数据时,才会访问数据库,调⽤数据的情况包括迭代、序列化、与if合⽤
不会访问数据库 qs = BookInfo.objects.all()
访问数据库 for book in qs:
print(book.btitle)
2.缓存
使⽤同⼀个查询集,第⼀次使⽤时会发⽣数据库的查询,然后Django会把结果缓存下来,再次使⽤这个查询集时会使⽤缓存的数据,减少了数据库的查询次数。
不使⽤缓存
[book.id for book in BookInfo.objects.all()]
[book.id for book in BookInfo.objects.all()]
使⽤缓存
qs=BookInfo.objects.all()
[book.id for book in qs]
[book.id for book in qs]
5.限制查询集 实现limit语句
qs = BookInfo.objects.all()[0 : 2 ]
模型管理器
1.概念 管理器是Django的模型进⾏数据库操作的接⼝,Django应⽤的每个模型类都拥有⾄少⼀个管理器。
2.管理器对象objects
是模型管理器类Manager⾃动实例化出来的对象
⽤于调⽤模型提供的各种⼯具⽅法
create()
all()
get()
count()
filter()
exclude()
......
3.⾃定义管理器
1.注意:⼀旦为模型类指明⾃定义的过滤器后,Django不再⽣成默认管理对象objects。
2.⾃定义管理器需求 当管理器提供的功能,⽆法满⾜当前需求时,可以⾃定义管理器,扩充功能
3.⾃定义⽅式
class BookInfoManager(models.Manager): """⾃定义模型类管理器""" pass books = BookInfoManager()
Admin站点
使⽤步骤
使⽤Django的管理模块,需要按照如下步骤操作:
1. 管理界⾯本地化
2. 创建管理员
3. 注册模型类
4. ⾃定义管理⻚⾯
1.管理界⾯本地化
# LANGUAGE_CODE = 'en-us' # 简体中⽂ LANGUAGE_CODE = 'zh-hans' # TIME_ZONE = 'UTC' # 亚洲上海时区 TIME_ZONE = 'Asia/Shanghai'
2.创建管理员 python manage.py createsuperuser
3.注册模型类 admin.py
admin.site.register(models.BookInfo)
4.定义模型类站点管理类
1.⽅式⼀
class BookInfoAdmin(admin.ModelAdmin):
"""图书模型类管理类"""
pass
admin.site.register(models.BookInfo, BookInfoAdmin)
2.⽅式⼆
@ admin.register(models.HeroInfo)
class HeroInfoAdmin(admin.ModelAdmin):
"""英雄模型类管理类"""
pass
使⽤了装饰器之后,不⽤再调⽤admin.site.register()
5.调整列表⻚展示
BookInfoAdmin
# 默认每⻚显示的数据数量
list_per_page = 2
# 操作选项
actions_on_bottom = True
# 显示的列
list_display = ['id', ' btitle' , 'new_pub_date']
将⽅法作为列
1.models.BookInfo类中
def new_pub_date(self):
"""将⽇期格式化后展示"""
return datetime.strftime( self.bpub_date, '%Y年 %m⽉ %d⽇ ' )
new_pub_date.short_description = ' 发布⽇期' # 设置⽅法字段在admin中显示的标题
new_pub_date.admin_order_field = ' bpub_date' # 指定排序依据
2.将⽅法添加到要显示的列 # 显示的列
list_display = ['id', ' btitle' , 'new_pub_date']
HeroInfoAdmin
# 右侧过滤栏
list_filter = [' hbook' , ' hgender' ]
# 顶部搜索框
search_fields = [' hname' ]
关联对象
1.需求 展示英雄时,将英雄所在的书的阅读量关联出来
2.在 HeroInfo模型类中指定关联
# 定义英雄模型类HeroInfo
class HeroInfo(models.Model):
......
def read(self):
"""将该英雄所属于的书的阅读量关联进来"""
return self.hbook.bread
read.short_description = ' 阅读量'
3.添加到列
@ admin.register(models.HeroInfo)
class HeroInfoAdmin(admin.ModelAdmin):
"""英雄模型类管理类"""
......
list_display = ['id', ' hname' , ' hbook' , 'read']
6.调整编辑⻚展示
class BookInfoAdmin(admin.ModelAdmin): """图书模型类管理类""" ...... # 编辑⻚⾯ # 允许展示编辑的字段分组 fieldsets = ( (' 基本' , {'fields': [' btitle' , ' bpub_date' , 'image']}), (' ⾼级' , { 'fields': ['bread', ' bcomment' ], 'classes': ('collapse',) # 是否折叠显示 }) )
关联
1.准备关联的类
class HeroInfoStackInline(admin.StackedInline):
model = models.HeroInfo # 要编辑的对象
extra = 1 # 附加编辑的数量
2.添加关联
class BookInfoAdmin(admin.ModelAdmin):
"""图书模型类管理类"""
......
# 关联
inlines = [HeroInfoStackInline]
7.调整站点全局⻚⾯信息
1.需求
• admin.site.site_header 设置⽹站⻚头
• admin.site.site_title 设置⻚⾯标题
• admin.site.index_title 设置⾸⻚标语
2 .实现
# 设置admin⽹⻚信息
admin.site.site_header = ' banner'
admin.site.site_title = ' msn'
admin.site.index_title = ' 主页'
8.站点上传图⽚
1.安装图⽚处理模块 pip install Pillow
2.指定上传的⽂件存储位置
# 指定上传的⽂件存储路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'static_files/media')
3.模型类准备image上传字段
# 定义图书模型类BookInfo class BookInfo(models.Model): btitle = models.CharField(max_length= 20, verbose_name= ' 名称' ) bpub_date = models.DateField(verbose_name= ' 发布⽇期' ) bread = models.IntegerField(default= 0 , verbose_name= ' 阅读量' ) bcomment = models.IntegerField(default= 0 , verbose_name= ' 评论量' ) is_delete = models.BooleanField(default= False, verbose_name= ' 逻辑删除' ) image = models.ImageField(upload_to= 'book', verbose_name= ' 图书图⽚' , null= True)
4.迁移 python manage.py makemigrations
python manage.py migrate
5.image字段展示
class BookInfoAdmin(admin.ModelAdmin): """图书模型类管理类""" ...... # 编辑⻚⾯ # 允许展示编辑的字段分组 fieldsets = ( (' 基本' , {'fields': [' btitle' , ' bpub_date' , 'image']}), (' ⾼级' , { 'fields': ['bread', ' bcomment' ], 'classes': ('collapse',) # 是否折叠显示 }) )
相关源码连接:
django 基础框架学习 (三)的更多相关文章
- django 基础框架学习 (二)
Django框架基础-02 Django缓存cookie 1.说明 当我们服务器在响应数据的同时,希望写⼊⼀些缓存数据到客户端 我们可以选择在响应的同时,将要写⼊到客户端的 ...
- django 基础框架学习 (一)
Django-01 Web框架 1.Web应⽤程序处理流程 : 2.Web框架的意义 1.⽤于搭建Web应⽤程序 2.免去不同Web应⽤相同代码部分的重复 ...
- Struts2框架学习(三) 数据处理
Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...
- Django基础——Model篇(三)
一 Django ORM中的概念 ORM —— 关系对象映射,是Object Relational Mapping的简写,是用来简化数据库操作的框架 Django ORM遵循Code Frist原则, ...
- Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..
PS:踏踏实实走好每一步... 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现 ...
- 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(三)
Spring+SpringMVC MVC呢,现在似乎越来越流行使用SpringMVC框架,我自己用的感觉,是非常好,确实很舒服,配置一开始是麻烦了一点点,但是后续的开发真的是很清爽! SpringMV ...
- python flask框架学习(三)——豆瓣微信小程序案例(二)整理封装block,模板的继承
我们所要实现的效果: 点击电影的更多,跳转到更多的电影页面:点击电视剧的更多,跳转到更多的电视剧页面. 三个页面的风格相同,可以设置一个模板,三个页面都继承这个模板 1.在指定模板之前,把css放在一 ...
- WebGL——osg框架学习三
今天继续来Draw绘制的osg模块的学习,昨天我们学习的是StateBin渲染状态树节点类,今天我们来继续学习下一个Draw的基础类DrawableEntity渲染对象实体类.这个类和Drawable ...
- Struts2框架学习(三)——配置详解
一.struts.xml配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts ...
随机推荐
- Java-API-Package:org.springframework.beans.factory.annotation
ylbtech-Java-API-Package:org.springframework.beans.factory.annotation 1.返回顶部 1. @NonNullApi @NonNull ...
- Hybrid App混合模式移动应用开发(AngularJS+Cordova+Ionic)
以前公司开发了某手机APP是通过jquerymobile来实现的,发现它对手机上的原生设备无能为力.于是在下一个项目到来之际,通过筛选最终决定使用cordova+Ionic.看起来简单,但是因为他们各 ...
- myeclipse10启动service窗口报异常
1:找到与之对应的tomcat: 2:删掉“.metadata/.plugins/org.eclipse.core.runtime/.settings/ com.genuitec.eclipse.as ...
- C语言学习笔记--#error 、 #line 和 #pragma 的使用
1. #error 的用法 (1)#error 是一种预编译器指示字,用于生成一个编译错误消息 (2)用法:#error message //注意:message 不需要用双引号包围 (3)#erro ...
- spirng boot web配置开发
spring-booter-starter-web是spring-boot web发开的核心,自动配置信息存储在spring-boot-autoconfigure.jar 下面的web目录里面,包含了 ...
- TextView中ellipsize属性
TextView中可以设置一个ellipsize属性,作用是当文字长度超过textview宽度时的显示方式: 例如,"encyclopedia"显示, 只是举例,以实际显示为准:) ...
- 【转】nginx禁止访问某个文件和目录(文件夹)
nginx禁止访问所有.开头的隐藏文件设置 location ~* /.* {deny all;} nginx禁止访问目录, 例如:禁止访问path目录 location ^~ /path {deny ...
- Linux 编译安装内核
一.简介 内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性.Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新.新的内核修 ...
- GCD 学习(四) dispatch_group
如果想在dispatch_queue中所有的任务执行完成后在做某种操作,在串行队列中,可以把该操作放到最后一个任务执行完成后继续,但是在并行队列中怎么做呢.这就有dispatch_group 成组操作 ...
- p1129 [ZJOI2007]矩阵游戏
传送门 分析 不难想到将黑点的行列连边,然后判断最大匹配是否等于n 代码 #include<iostream> #include<cstdio> #include<cst ...