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