django之model进阶以及中介模型

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

posted @ 2017-12-16 17:27  chitalu  阅读(93)  评论(0)    收藏  举报