批量插入数据,自定义分页器

批量插入数据

首先是普通创建

结果我们发现for循环创建数据 1000本太慢了,效率极低,每次都要去走一次数据库

for i in range(1000):
    models.Book.ojbects.create(name='第%s书'%i)

bulk_create批量处理 可以一次性的插入多条数据

a = [] # 先生成一个容器
for i in range(100000):
	# 再不断地向容器添加生成的数据
    a.append(models.Book(name='第%s书'%s))
# 最后利用bulk_create批量插入数据
models.Book.objects.bulk_create(a)
book_qeryset = models.Book.objects.all()  #插入的数据查询出来展示到前端
return render(request,'test.html',locals())

先放在一个列表里面,bulk_create

自定义分页器

这么多书的标签只在一个网页里面 明显不合理

建立分页器 divmod(100,9) 返回触发的结果或者余数

**大致思路 **

"""
1.获取用户想要获取的页码数,如果没有就给默认展示第一页
2.每页展示10条数据
3.定义起始位置和终止位置  (应该为动态的数据)
4.统计数据的总条数
5.求数据到底需要多少页才能展示完

"""

那么我们的数据必须动态展示,扩展性要高一点,所以..

current_page = request.Get.get('page',1) # 没有page参数,就默认展示第一页

current_page = int(current_page)
per_page_num = 10 # 每页展示10条数据   
# 还需要定义起始的位置和终止位置
start_page = (current_page-1)* per_page_num
end_page = current_page*per_page_num

"""
per_page_num = 10
current_page 第一页的时候start_page 数据是从0-10
第二页的时候则是    start_page则是10-20
列出如下列表
er_page_num = 10
current_page                   start_page                      end_page
    1                              0                                10
    2                              10                               20
    3                              20                               30 
    4                              30                               40

所以得出关系式为start_page = (current_page-1)* per_page_num
end_page = current_page*per_page_num


"""

代码实现..可以在后端写完代码,放在前端里面.

def index(request):
    # 1获取用户想要访问的页码数
    current_page = request.GET.get('page',1) # 默认为1		
    # 转成整型
    current_page = int(current_page)
    # 2每页展示10条数据
    per_page_num = 10
    
    # 3定义起始位置跟终止位置
    start_page = (current_page-1)*per_page_num
    end_page = current_page*per_page_num
    
    # 4统计数据的总条数便于计算
    book_queryset = models.Book.objects.all()
    all_count = book_queryset.count()
    
    # 5计算页数
    page_num, res = divmod(all_count, per_page_num)
    if res: 
        page_num+=1
	page_html = ''
    xxx = current_page # xxx 就是用户点击的数字
    if current_page <6:
        current_page = 6
	for i in range(current_page-5, current_page+6):
        if xxx ==i:
            page_html += '<li class="active"><a href="?page=%s">%s</a></li>'%(i, i)
    book_queryset = book_queryset[start_page:end_page]
    return render(request, 'index.html', locals())
    

弄了这么多还是使用别人写的香

自定义分页器的使用

新建一个py文件直接将代码拷贝进去

        后端
            from app01.utils.mypage import Pagination
            # 使用封装好的分页器代码
            def login(request):
                book_queryset = models.Book.objects.all()
                current_page = request.GET.get('page',1)
                all_count = book_queryset.count()
                # 1.实例化产生对象
                page_obj = Pagination(current_page=current_page,all_count=all_count)
                # 2.对真实数据进行切片操作
                page_queryset = book_queryset[page_obj.start:page_obj.end]
                return render(request,'login.html',locals())
    前端
        
        {% for book_obj in page_queryset %}
            <p>{{ book_obj.title }}</p>
        {% endfor %}
        {{ page_obj.page_html|safe }}
posted @ 2019-10-29 20:25  Huise.J  阅读(197)  评论(0编辑  收藏  举报