重修课程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‘)

 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>
时间: 2024-11-09 02:46:20

重修课程day61(django之补充)的相关文章

重修课程day62(django之中间件)

中间件: class MiddleWare2(MiddlewareMixin): def process_request(self,request): print("MW2 request...........") # return HttpResponse("666!") def process_view(self, request, callback, callback_args, callback_kwargs): # print("callback

07: Django 学习补充

目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:ModelForm 数据验证 & 生成html & 数据库操作 06: Django Admin 07: Django 学习补充 1.1 待补充

Python学习---django知识补充之CBV

Django知识补充之CBV Django: url    -->  def函数      FBV[function based view]  用函数和URL进行匹配 url    -->  类           CBV[function based view]  用类和URL进行匹配 POSTMAN插件 http://blog.csdn.net/zzy1078689276/article/details/77528249 基于CBV的登录实例: settings.py INSTALLED_

重修课程day7(python基础4之基础补充)

一 bit,和bytes的关系 bit:就是计算机的最小的表示单位. bytes:就是计算机的最小的储存单位. 1  字节(bytes) = 8 位(bit) 格式: print(bytes('字符',encoding='utf-8')) 文件默认读取文件 二 strip的其他功能 strip去掉两边的空格,换行符,制表符等等,还可以指定删除字符 a=' dsad ' print(a.strip()) b='\ndsfsadagh\t' print(b.strip()) print(123) c

重修课程day57(Django的开始)

一 浏览器相关知识 http:只有依赖一回,属于短链接,不会报错客户端的信息. 浏览器相当于一个客户端,客户端的链接 服务端:socket服务端,起服务监听客户端的请求. import socket sk=socket.socket() sk.bind(('192.168.11.38',8888)) sk.listen(5) def index(): with open('轮播网页.html',encoding='utf-8')as f: ret=f.read() return ret def

重修课程day59(django之http)

一 http协议介绍 http协议(Hyper Text Transfer Protocol):超文本传输协议,是基于应用层的面向对象协议,靠tcp协议和IP来传输数据,请求和响应是http协议的基本概念. http协议工作于客户端与服务端架构之上,浏览器作为http客户端通过url向HTTP服务端发送所有请求. 二 http特点 1 简单快速:浏览器向服务端发送请求时,只需要传送请求的方法和路径. 请求方法:GET,POST,HEAD,不同方法有着不同的联系类型. 2 灵活:http传输可以是

Python菜鸟之路:Django 路由补充FBV和CBV

在Python菜鸟之路:Django 路由.模板.Model(ORM)一节中,已经介绍了几种路由的写法及对应关系,那种写法可以称之为FBV: function base view . 今天补充另外一种路由关系的写法:CBV,即:class base view , 也可以看做为面向资源编程的另外一种叫法,类似tornado中的路由写法. 1. 建立路由关系urls.py from app01 import views urlpatterns = [ url(r'^home/', views.Hom

Django 【补充】ORM多对多正向查询

一.多对多的正反向查询 class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名") course = models.CharField(verbose_name="课程",max_length=32) def __str__(self): return self.name class Teacher(models.Model): name = models.

Django知识补充

一.文件上传 1.三种方式 通过form表单提交实现基本上传 通过From类上传 ajax上传 from django.shortcuts import render,HttpResponse from django import forms from django.forms import fields class UploadForm(forms.Form): user = fields.CharField() img = fields.FileField() def upload(requ