一 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>