重修課程day61(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‘)View Code
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>
重修課程day61(django之補充)