• 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>
    
  • 相关阅读:
    nodeJS实现完整文件夹结构压缩
    chrome浏览器插件开发
    让用户端JS触发F11全屏
    inline-block和float的共性和区别
    安家落户
    ActiveMQ简单实现之一对一生产和消费
    Centos下 修改mysql密码
    虚拟机centos7 安装was和ihs
    webservice简单实现
    Centos7安装mysql
  • 原文地址:https://www.cnblogs.com/fangjie0410/p/8043743.html
Copyright © 2020-2023  润新知