django之补充
一 QuerySet类型
QuerySet类型:只和orm有关,如果一涉及数据库,就会有QuerySet类型的出现。
QuerySet切片操作:QuerySet是支持切片操作的,不过不能放负数。查询集的切片会返回一个新的查询集,不会执行查询。
Entry.objects.all()[:5] # (LIMIT 5) Entry.objects.all()[5:10] # (OFFSET 5 LIMIT 5)
QuerySet遍历操作:
# for book in bookList:
# print(book.title)
可迭代对象:用于优化缓存,将QuerySet对象做成一个迭代器。iterator就是将QueSet做成一个迭代器,不能复用,只能够操作一次。这样第二次拿数据就不能从缓存中拿取数据了。
# 优化QuerySet的缓存
bookList=Book.objects.all() # (1) exists优化
# if bookList.exists():
# print("有记录")
# (2)
# bookList = Book.objects.all().iterator()
# print(bookList)
# print(type(bookList)) # generator # for book in bookList:
# print(book.title)
# for book in bookList:
# print(book.title)
惰性查询:使用时才会在内存中产生,一次只拿一个,哪一个丢一个。不用的时候是不会在内存中产生的。QuerySet不是使用时是不会产生sql语句的,也就是说请求查询集才会到数据库查找。主要时最大程度防止做无效的操作。
# bookList=Book.objects.all()
# for book in bookList:
# print(book) # print(bookList[1]) # if bookList:
# print("hello")
缓存机制:第一次走完数据库过后,就不会在走第二次数据库了,而是在第一次走完数据库后,将数据放在了缓存中,这样一来第二次的时候直接就可以到数据库中拿去数据了。QuerySet对象就是那一个缓存机制。
# bookList=Book.objects.all()
# for book in bookList:
# print(book)
#
# Book.objects.create(title="linux",price=20,publish_id=1,publishDate="2012-12-12")
#
# for book in bookList:
# print(book) # bookList=Book.objects.all()
# for book in bookList:
# print(book) # print(bookList[1]) # if bookList:
# print("hello") # for book in Book.objects.all():
# print(book)
#
# for book in Book.objects.all():
# print(book)
二 中介模型
through=‘多对多的关联表’:将那张多对多的关联表手动创建,再用through告诉orm第三张表记录已经创建,不需要在创建。
class TagLanguage(models.Model):
'''
标签语
'''
Text=models.CharField(max_length=50) # 标签文本
CreateTime=models.DateTimeField() # 标签创建的时间 class ArticleToTag(models.Model):
'''
标签和文章的关系关系表
'''
article_id=models.ForeignKey('Article') # 关联文章表
Tag_id=models.ForeignKey('TagLanguage') # 关联标签表 class Article(models.Model):
'''
文章信息
'''
article_name=models.CharField(max_length=20) # 文章名
summary=models.CharField(max_length=259) # 摘要部分
DateTime=models.DateTimeField() # 发布的时间日期
author=models.CharField(max_length=15) # 作者
randings=models.IntegerField(max_length=8) # 阅读数量
personalSite=models.ForeignKey('PersonalSite') # 与个人站点关联,以以一对多的关系关联
tagLangusges = models.ManyToManyField('TagLanguage',through='ArticleToTag')
extra函数:django的查询语句,为了不能够对应sql语句的提供一个语句拼接。为QuerySet进行了一些修改,一边用orm,另一边用的时sql语句。
使用格式:extra={'拿到的字段','sql语句'}。
strftime:方法内部格式:('strftime——>sql语句',时间对象)
# 查询每一个年月出版的书籍个数
'''
sql: select date from book group by date_format(publishDate,"%Y-%m") as date ''' # ret=Book.objects.all().extra(select={"pub_year_month":"strftime('%%Y-%%m',publishDate)","isGt100":"price>100"}).values("title","pub_year_month","isGt100")
#
# print(ret) #bookList=Book.objects.all().extra(select={"pub_year_month":"strftime('%%Y',publishDate)"}).values("pub_year_month","title").annotate(c=Count("id")).values("pub_year_month","c")
bulk_create:批量的插入数据,将实例的对下昂管放在一个列表中,然后再将列表的数据咋一次的添加进去。
批量导入数据:
for i in range(100):
Book.objects.create(title="book"+str(i),price=i*4) bookList=[]
for i in range(100):
book=Book(title="book"+str(i),price=i*4)
bookList.append(book) Book.objects.bulk_create(bookList)
三 分页模块
Paginator米快,分页,这时django自带的一种分页模块
导入路径:from django.core.paginator impost Paginator.
对象的三个属性:
count:总共数据的条数
num_pages:能分成多少页数
page_range:显示的页码数
其他操作:
page(数字):具体哪一页。
object_list:取到对应的数据
has_next:是否有下一页
next_page_number:下一页
has_previous:是否有上一页
previous_page_number:上一页
def index(request):
'''
批量导入数据:
for i in range(100):
Book.objects.create(title="book"+str(i),price=i*4)
bookList=[]
for i in range(100):
book=Book(title="book"+str(i),price=i*4)
bookList.append(book)
Book.objects.bulk_create(bookList)
:param request:
:return:
'''
book_list = Book.objects.all()
paginator = Paginator(book_list, 2)
try:
# paginator对象三个属性
print(paginator.count) # Paginator
print(paginator.num_pages) # 13
print(paginator.page_range) # range(1, 14)
# 具体页对象
num = request.GET.get("page", 1)
num = int(num)
page = paginator.page(num)
'''
print(page.has_next()) #是否有下一页
print(page.next_page_number()) #下一页的页码
print(page.has_previous()) #是否有上一页
print(page.previous_page_number()) #上一页的页码
'''
# print("===========",page.next_page_number())
# print("===========",page.previous_page_number())
except Exception:
page=paginator.page(1)
book_list = page.object_list
return render(request,"index.html",locals())
异常处理:
导入异常:from django.paginator import Emginator,PageNotAnInteger
try:
print(page)
book_list = paginator.page(page)
except PageNotAnInteger:
book_list = paginator.page(1)
except EmptyPage:
book_list = paginator.page(paginator.num_pages)
html文件实例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 新 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head>
<body> <ul>
{% for book in book_list %}
<li>{{ book.title }}----------->{{ book.price }}</li>
{% endfor %} </ul> <ul class="pagination">
{% if page.has_previous %}
<li><a href="/index/?page={{ page.previous_page_number }}" aria-label="Previous">上一页</a></li>
{% else %}
<li class="disabled"><a href="" aria-label="Previous">上一页</a></li>
{% endif %} {% for pageNum in paginator.page_range %}
{% if num == pageNum %}
<li class="active"><a href="/index/?page={{ pageNum }}">{{ pageNum }}</a></li>
{% else %}
<li><a href="/index/?page={{ pageNum }}">{{ pageNum }}</a></li>
{% endif %}
{% endfor %} {% if page.has_next %}
<li><a href="/index/?page={{ page.next_page_number }}" aria-label="Next">下一页</a></li>
{% else %}
<li class="disabled"><a href="" aria-label="Next">下一页</a></li>
{% endif %}
</ul> </body>
</html>
django之补充的更多相关文章
- Django组件补充(缓存,信号,序列化)
Django组件补充(缓存,信号,序列化) Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑 ...
- Python学习---django知识补充之CBV
Django知识补充之CBV Django: url --> def函数 FBV[function based view] 用函数和URL进行匹配 url --> ...
- Django 知识点补充
Django 知识点补充 1 Django如何在Model保存前做一定的固定操作,比如写一条日志 (1)利用Django的Model的Signal Dispatcher, 通过django.db.mo ...
- django进阶补充
前言: 这篇博客对上篇博客django进阶作下补充. 一.效果图 前端界面较简单(丑),有两个功能: 从数据库中取出书名 eg: 新书A 在form表单输入书名,选择出版社,选择作者(多选),输入完毕 ...
- Python之Django rest_Framework补充
一.什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移" ...
- Django知识补充
目录 一.文件上传 二.Models补充 三.Django总结 一.文件上传 1.通过form表单或者通过From类上传 views.py from django.shortcuts import r ...
- Python菜鸟之路:Django 路由补充1:FBV和CBV - 补充2:url默认参数
一.FBV和CBV 在Python菜鸟之路:Django 路由.模板.Model(ORM)一节中,已经介绍了几种路由的写法及对应关系,那种写法可以称之为FBV: function base view ...
- Python Django框架 补充
Django REST framework ORM框架整理 Django框架 app间互借models字段的操作 ORM数据库操作补充:models中的一对一操作.过滤.事务 Django model ...
- Django Web补充
一.今日内容 一.Django ORM连表操作 Q,F 二.Form表单验证 面向对象 正则 三.Session框架 面向对象 cookie toanado扩展 二.Django ORM一对多数据创建 ...
- 【django基础补充之URL,视图,模版】
一.url路由配置 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代 ...
随机推荐
- .net 报错access to the path c:\tempimagefiles\msc_cntr_0.txt is denied
报错信息: 解决方法: 在 Web.Config 的 <System.Web> 里加 <identity impersonate="true"/> 节点即可 ...
- FortiGate软件版本升级
1.Web界面升级 1)注意:升级前,务必做好配置备份 2)要点 1.FortiGate防火墙的每款型号都有单独的版本文件,升级前务必确认下当前的设备型号: 2.升级包的后缀名必须为.out,前缀任意 ...
- 民生银行十五年的数据体系建设,深入解读阿拉丁大数据生态圈、人人BI 是如何养成的?【转】
早在今年的上半年我应邀参加了由 Smartbi 主办的一个小型数据分析交流活动,在活动现场第一次了解到了民生银行的阿拉丁项目.由于时间关系,嘉宾现场分享的内容非常有限.凭着多年对行业研究和对解决方案的 ...
- 手动获取被spring管理的bean对象工具
在netty handler开发中,我们无法将spring的依赖注入到Handler中,无法进行数据库的操作,这时候我们就需要手动获取被spring管理的bean对象: 创建一个 imp ...
- 42-2017蓝桥杯b java
1.购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都 ...
- docker数据卷(转)
原文地址:http://www.cnblogs.com/zydev/p/5809616.html Docker-数据卷和数据容器卷 容器中管理数据主要有两种方式: 数据卷(Data Volumes) ...
- spyder在编辑过程中被自己弄乱了,想要恢复成安装时默认的格式或者重置页面格式的解决办法
打开spyder,tools-->Reset Spyder to factory defaults,按照如上操作即可恢复成安装时的默认格式.
- MVC之CodeFirst
1.建立MVC项目>NuGet安装EF 2.建立模型: public class Blog { [Key] [DatabaseGenerated(DatabaseGeneratedOption. ...
- vue 环境搭建
目前我们的项目前端都采用的是vue js为了方便开发过程中前后端同事进行功能对接,建议每个同事都准备好前后端环境(前端的同事参考文档第二部分,后端同事请参考第一部分),只要保持前后端代码是最新的就可以 ...
- PAT 甲级 1005 Spell It Right (20)(代码)
1005 Spell It Right (20)(20 分) Given a non-negative integer N, your task is to compute the sum of al ...