1. 程式人生 > >重修課程day61(django之補充)

重修課程day61(django之補充)

cti sed pen render clas int exist log cal

一 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之補充)