【一】批量插入
【1】基础准备
(1)创建模型表
from django. db import models
class User ( models. Model) :
name = models. CharField( max_length= 32 )
(2)模板层代码
<! DOCTYPE html >
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< title> Title</ title>
< meta name = " viewport" content = " width=device-width,initial-scale=1.0" >
< script src = " https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js" > </ script>
< link rel = " stylesheet" href = " https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" >
< script src = " https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js" > </ script>
</ head>
< body>
{#显示所有用户名称#}
{% for user in user_queryset %}
< p> {{ user.name }}</ p>
{% endfor %}
</ body>
</ html>
(3)路由层代码
from django. contrib import admin
from django. urls import path
from app02 import views
urlpatterns = [
path( 'admin/' , admin. site. urls) ,
path( "data/batch/" , views. data_batch, name= "data_batch" )
]
(4)视图层代码
from django. shortcuts import render, HttpResponse
from app02 import models
import time
def data_batch ( request) :
user_queryset = models. User. objects. all ( )
return render( request, 'data_batch.html' , locals ( ) )
【2】批量插入数据
(1)老方法create
start_time = time. time( )
total_count = 1000
for i in range ( total_count) :
models. User. objects. create( name= f"bruce { i} " )
print ( f"插入数据 { total_count} 条,用时: { time. time( ) - start_time} s" )
(2)新方法bulk_create
start_time = time. time( )
total_count = 1000
user_list = [ ]
for i in range ( total_count) :
user_obj = models. User( name= f"bruce { i} " )
models. User. objects. bulk_create( user_list)
print ( f"插入数据 { total_count} 条,用时: { time. time( ) - start_time} s" )
【二】分页器
【1】自己写low版
(1)前端页面
<! DOCTYPE html >
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< title> Title</ title>
< meta name = " viewport" content = " width=device-width,initial-scale=1.0" >
< script src = " https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js" > </ script>
< link rel = " stylesheet" href = " https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" >
< script src = " https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js" > </ script>
</ head>
< body>
{#展示数据#}
{% for user in user_queryset %}
< p> {{ user.name }}</ p>
{% endfor %}
{#展示分页器#}
< nav aria-label = " Page navigation" >
< ul class = " pagination" >
{{ html_li|safe }}
</ ul>
</ nav>
</ body>
</ html>
(2)视图层
from django. shortcuts import render
from app01 import models
def data_pagination ( request) :
user_queryset = models. User. objects. all ( )
total_digit = user_queryset. count( )
per_page = 10
quotient, remainder = divmod ( total_digit, per_page)
total_page = quotient + ( 1 if remainder else + 0 )
print ( f"total_page: { total_page} " )
now_page = min ( total_page, max ( 1 , int ( request. GET. get( 'page' , "1" ) ) if request. GET. get( "page" , "1" ) . isdigit( ) else 1 ) )
button_num = 5
button_num = max ( 3 , button_num if button_num % 2 else button_num - 1 )
half_button_num = button_num // 2
mid_page = min ( max ( now_page, half_button_num + 1 ) , total_page - half_button_num)
print ( f"mid_page: { mid_page} " )
user_queryset = user_queryset[ ( now_page - 1 ) * per_page: now_page * per_page]
if now_page <= 1 :
html_li = '<li class="disabled"><span aria-hidden="true">«</span></li>'
else :
html_li = f'<li><a href="?page= { now_page - 1 } " aria-label="Previous"><span aria-hidden="true">«</span></a></li>'
for i in range ( mid_page - button_num // 2 , mid_page + button_num // 2 + 1 ) :
if now_page == i:
html_li += f'<li class="active"><a href="?page= { i} "> { i} </a></li>'
else :
html_li += f'<li><a href="?page= { i} "> { i} </a></li>'
if now_page >= total_page:
html_li += '<li class="disabled"><span aria-hidden="true">»</span></li>'
else :
html_li += f'<li><a href="?page= { now_page + 1 } " aria-label="Next"><span aria-hidden="true">»</span></a></li>'
return render( request, 'data_pagination.html' , { "user_queryset" : user_queryset, "html_li" : html_li} )
【2】专业版本(面向对象)
(1)说明
当我们需要使用非django内置 的第三方功能 或者组件 的代码时 一般在根目录 或者应用目录下 创建一个utils文件夹
在该文件夹下可以进行功能划分,再创建相应模块文件 功能少也可以不划分,直接创建模块文件
(2)专业分页器
class Pagination ( object ) :
def __init__ ( self, current_page, all_count, per_page_num= 2 , pager_count= 11 ) :
"""
封装分页相关数据
:param current_page: 当前页
:param all_count: 数据库中的数据总条数
:param per_page_num: 每页显示的数据条数
:param pager_count: 最多显示的页码个数
"""
try :
current_page = int ( current_page)
except Exception as e:
current_page = 1
if current_page < 1 :
current_page = 1
self. current_page = current_page
self. all_count = all_count
self. per_page_num = per_page_num
all_pager, tmp = divmod ( all_count, per_page_num)
if tmp:
all_pager += 1
self. all_pager = all_pager
self. pager_count = pager_count
self. pager_count_half = int ( ( pager_count - 1 ) / 2 )
if current_page > all_pager:
current_page = all_pager
@property
def start ( self) :
return ( self. current_page - 1 ) * self. per_page_num
@property
def end ( self) :
return self. current_page * self. per_page_num
def page_html ( self) :
if self. all_pager <= self. pager_count:
pager_start = 1
pager_end = self. all_pager + 1
else :
if self. current_page <= self. pager_count_half:
pager_start = 1
pager_end = self. pager_count + 1
else :
if ( self. current_page + self. pager_count_half) > self. all_pager:
pager_end = self. all_pager + 1
pager_start = self. all_pager - self. pager_count + 1
else :
pager_start = self. current_page - self. pager_count_half
pager_end = self. current_page + self. pager_count_half + 1
page_html_list = [ ]
page_html_list. append( '''
<nav aria-label='Page navigation>'
<ul class='pagination'>
''' )
first_page = '<li><a href="?page=%s">首页</a></li>' % ( 1 )
page_html_list. append( first_page)
if self. current_page <= 1 :
prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
else :
prev_page = '<li><a href="?page=%s">上一页</a></li>' % ( self. current_page - 1 , )
page_html_list. append( prev_page)
for i in range ( pager_start, pager_end) :
if i == self. current_page:
temp = '<li class="active"><a href="?page=%s">%s</a></li>' % ( i, i, )
else :
temp = '<li><a href="?page=%s">%s</a></li>' % ( i, i, )
page_html_list. append( temp)
if self. current_page >= self. all_pager:
next_page = '<li class="disabled"><a href="#">下一页</a></li>'
else :
next_page = '<li><a href="?page=%s">下一页</a></li>' % ( self. current_page + 1 , )
page_html_list. append( next_page)
last_page = '<li><a href="?page=%s">尾页</a></li>' % ( self. all_pager, )
page_html_list. append( last_page)
page_html_list. append( '''
</nav>
</ul>
''' )
return '' . join( page_html_list)
(3)使用
先在根目录下创建utlis/mypage.y
视图层
def data_pagination ( request) :
user_queryset = models. User. objects. all ( )
total_digit = user_queryset. count( )
per_page = 10
quotient, remainder = divmod ( total_digit, per_page)
total_page = quotient + ( 1 if remainder else + 0 )
now_page = min ( total_page, max ( 1 , int ( request. GET. get( 'page' , "1" ) ) if request. GET. get( "page" , "1" ) . isdigit( ) else 1 ) )
button_num = 5
button_num = max ( 3 , button_num if button_num % 2 else button_num - 1 )
page_obj = Pagination( current_page= now_page, all_count= total_digit, per_page_num= per_page, pager_count= button_num)
user_queryset = user_queryset[ page_obj. start: page_obj. end]
return render( request, 'data_pagination.html' , locals ( ) )
<! DOCTYPE html >
< html lang = " en" >
< head>
< meta charset = " UTF-8" >
< title> Title</ title>
< meta name = " viewport" content = " width=device-width,initial-scale=1.0" >
< script src = " https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js" > </ script>
< link rel = " stylesheet" href = " https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" >
< script src = " https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js" > </ script>
</ head>
< body>
< div class = " container" >
< div class = " row" >
< div class = " col-md-8 col-md-offset-2" >
{% for user in user_queryset %}
< p> {{ user.name }}</ p>
{% endfor %}
{{ page_obj.page_html|safe }}
</ div>
</ div>
</ div>
</ body>
</ html>