11_08、批量插入数据和分页
一、批量插入数据
# 制作一张表 from django.db import models class Book(models.Model): title = models.CharField(max_length=32, verbose_name='图书标题') price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='价格')
'''批量插入数据''' book_list = [] for i in range(200): book_obj = models.Book(title='第%s本书' % i, price=i) # 循环生成对象,并没有操作数据库 book_list.append(book_obj) # 把生成的对象放入空列表,没有操作数据库 # 把存放对象的列表,生成记录 models.Book.objects.bulk_create(book_list) # 操作数据库,且只操作了一次数据库
二、faker库
faker库是python中一个能随机生成各种对象的数据库,包括虚拟名称、地址等
先下载faker
1.基本使用
from faker import Faker #创建对象,默认生成的数据为为英文,使用zh_CN指定为中文 fake = Faker('zh_CN') print(fake.name())#随机生成姓名 print(fake.address())#随机生成地址 print(fake.phone_number())#随机生成电话号码 print(fake.pystr())#随机生成字符串 print(fake.email())#随机生成邮箱地址 for i in range(10): print(fake.name())#随机生成10个姓名 输出: 王秀云
内蒙古自治区通辽县闵行广州路F座 386588
13597398896
rgBIgQbcHVXNdrMKFmkR
natang@example.net
贺瑜
张桂花
柳荣
陈欣
应杨
周桂花
崔玉兰
李东
应婷婷
米丹
2.常用方法
1、地理信息类

city_suffix():市,县
country():国家
country_code():国家编码
district():区
geo_coordinate():地理坐标
latitude():地理坐标(纬度)
longitude():地理坐标(经度)
postcode():邮编
province():省份
address():详细地址
street_address():街道地址
street_name():街道名
street_suffix():街、路
2、基础信息类

ssn():生成身份证号 bs():随机公司服务名 company():随机公司名(长) company_prefix():随机公司名(短) company_suffix():公司性质,如‘信息有限公司’ fake.credit_card_expire(start=‘now’, end=’+10y’, date_format=’%m/%y’):随机信用卡到期日如’03/30’ credit_card_full():生成完整信用卡信息 credit_card_number():信用卡号 credit_card_provider():信用卡类型 credit_card_security_code():信用卡安全码 job():随机职位 first_name_female():女性名 first_name_male():男性名 name():随机生成全名 name_female():男性全名 name_male():女性全名 phone_number():随机生成手机号 phonenumber_prefix():随机生成手机号段,如139
3、邮箱信息类

ascii_company_email():随机ASCII公司邮箱名
ascii_email():随机ASCII邮箱:
company_email():
email():
safe_email():安全邮箱
4、网络基础信息类

domain_name():生成域名
domain_word():域词(即,不包含后缀)
ipv4():随机IP4地址
ipv6():随机IP6地址
mac_address():随机MAC地址
tld():网址域名后缀(.com,.net.cn,等等,不包括.)
uri():随机URI地址
uri_extension():网址文件后缀
uri_page():网址文件(不包含后缀)
uri_path():网址文件路径(不包含文件名)
url():随机URL地址
user_name():随机用户名
image_url():随机URL地址
5、浏览器信息类

chrome():随机生成Chrome的浏览器user_agent信息 firefox():随机生成FireFox的浏览器user_agent信息 internet_explorer():随机生成IE的浏览器- user_agent信息 opera():随机生成Opera的浏览器user_agent信息 safari():随机生成Safari的浏览器user_agent信息 linux_platform_token():随机Linux信息 user_agent():随机user_agent信息
6、数字信息

numerify():三位随机数字 random_digit():0~9随机数 random_digit_not_null():1~9的随机数 random_int():随机数字,默认0~9999,可以通过设置min,max来设置 random_number():随机数字,参数digits设置生成的数字位数 pyfloat():left_digits=5 #生成的整数位数, right_digits=2 #生成的小数位数, positive=True #是否只有正数 pyint():随机Int数字(参考random_int()参数) pydecimal():随机Decimal数字(参考pyfloat参数)
7、文本加密类

pystr():随机字符串 random_element():随机字母 random_letter():随机字母 paragraph():随机生成一个段落 paragraphs():随机生成多个段落 sentence():随机生成一句话 sentences():随机生成多句话,与段落类似 text():随机生成一篇文章 word():随机生成词语 words():随机生成多个词语,用法与段落,句子,类似 binary():随机生成二进制编码 boolean():True/False language_code():随机生成两位语言编码 locale():随机生成语言/国际 信息 md5():随机生成MD5 null_boolean():NULL/True/False password():随机生成密码,可选参数:length:密码长度;special_chars:是否能使用特殊字符;digits:是否包含数字;upper_case:是否包含大写字母;lower_case:是否包含小写字母 sha1():随机SHA1 sha256():随机SHA256 uuid4():随机UUID
8、时间信息类

date():随机日期 date_between():随机生成指定范围内日期,参数:start_date,end_date date_between_dates():随机生成指定范围内日期,用法同上 date_object():随机生产从1970-1-1到指定日期的随机日期。 date_time():随机生成指定时间(1970年1月1日至今) date_time_ad():生成公元1年到现在的随机时间 date_time_between():用法同dates future_date():未来日期 future_datetime():未来时间 month():随机月份 month_name():随机月份(英文) past_date():随机生成已经过去的日期 past_datetime():随机生成已经过去的时间 time():随机24小时时间 timedelta():随机获取时间差 time_object():随机24小时时间,time对象 time_series():随机TimeSeries对象 timezone():随机时区 unix_time():随机Unix时间 year():随机年份
三、分页推导
四、分页类的使用

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) @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): # 如果总页码 < 11个: if self.all_pager <= self.pager_count: pager_start = 1 pager_end = self.all_pager + 1 # 总页码 > 11 else: # 当前页如果<=页面上最多显示11/2个页码 if self.current_page <= self.pager_count_half: pager_start = 1 pager_end = self.pager_count + 1 # 当前页大于5 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 = [] # 添加前面的nav和ul标签 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)
from utils.mypage import Pagination def index(request): book_list = models.Book.objects.all() all_count = len(book_list) try: current_page = int(request.GET.get('page')) except Exception: current_page = 1 per_page_num = 10 page_obj = Pagination(current_page, all_count, per_page_num) html = page_obj.page_html() book_list_queryset = book_list[page_obj.start:page_obj.end] return render(request, 'index.html', locals())
<body> {% for book in book_list_queryset %} <p> {{ book.title }} </p> {% endfor %} {{ html|safe }} </body>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通