model进阶
queryset对象
1、支持切片操作,
2、支持遍历
3、属于惰性查询(不使用的时候,就不会执行sql语句)--> 涉及到需要里面的数据的时候就会查询
4、缓存机制,只有queryset对象有缓存机制,直接对查询的结果操作,没有缓存机制
5、优化缓存,
1、用.exists()方法查询是否有数据去优化
2、用.iterator()方法,封装成迭代器
中介模型
members = models.ManyToManyField(Person, through='Membership')
依旧在表中创建字段,但是第三张表是要自己去创建的,through指向第三张表
使用和中介模型的时候,添加多对多关系要自己去实现,实例化对象方法
extra()函数
mysql:date_format(date字段,"%Y-%m") -->,设置查询到的日期字段的形式
sqlite:strftime("%Y-%m",date字段) -->,设置查询到的日期字段的形式
ret = A.objects.all().extra(select={"key":"strftime("%%Y-%%m",date字段)","key":"对应的sql条件"})
-->对日期字段做处理之后放到查询结果中
加extra()之后对结果不会有影响,只是增加了字段
整体插入:
A.objects.bulk_create([放所有要实例对象]) --> 一次创建
Django的分页器:
批量导入数据:
Booklist=[]
for i in range(100):
Booklist.append(Book(title="book"+str(i),price=30+i*i))
Book.objects.bulk_create(Booklist)
分页器的使用:
book_list=Book.objects.all()
paginator = Paginator(book_list, 10)
print("count:",paginator.count) #数据总数
print("num_pages",paginator.num_pages) #总页数
print("page_range",paginator.page_range) #页码的列表
page1=paginator.page(1) #第1页的page对象
for i in page1: #遍历第1页的所有数据对象
print(i)
print(page1.object_list) #第1页的所有数据
page2=paginator.page(2)
print(page2.has_next()) #是否有下一页
print(page2.next_page_number()) #下一页的页码
print(page2.has_previous()) #是否有上一页
print(page2.previous_page_number()) #上一页的页码
可能报的两个错误:
page=paginator.page(12) # error:EmptyPage
page=paginator.page("z") # error:PageNotAnInteger