res = models.Book.objects.all() # 若是此时直接运行,不调用这个结果,终端将什么也不会打印出来 # 缘由:惰性查询,减小没必要要的数据库操做,下降数据库的压力
only 的优化机制:sql
res = models.Book.objects.only('title') # 括号内查询的字段能够有多个 print(res) # 查询一次,打印一条sql查询语句 for i in res: print(i.title) # 查询一次,打印一条sql查询语句 print(i.price) # 有几个对象,就查询几回,打印几条sql查询语句
defe 的优化机制:数据库
res = models.Book.objects.defer('title') # 括号内查询的字段能够有多个 print(res) # 查询一次,打印一条sql查询语句 for i in res: print(i.title) # # 有几个对象,就查询几回,打印几条sql查询语句 print(i.price) # 查询一次,打印一条sql查询语句
only 与 defer 的区别:app
共同点:二者括号内均可以放数据库字段,查询结果都是一个列表套一个个的数据对象。fetch
不一样点:优化
only:数据对象里面封装了括号内查询的字段,直接点这个括号内字段属性不须要再次查询数据库设计
若是查询括号内没有的字段,每查询一次,就须要去数据库中从新查询,效率低code
defer:数据库中封装了至关于除括号内查询的字段,直接点这个括号内字段属性须要再次查询数据库,若是查询括号内没有的字段,就不须要再次查询数据库,效率高orm
select_related :对象
res = models.Book.objects.select_related('publish') # 支持放多个外键字段 print(res) # 查询外键字段,连表查询 for i in res: print(i.publish.name) # 连表查询一次,一条sql语句 print(i.title) # 连表查询一次,一条sql语句
prefetch_related:
res = models.Book.objects.prefetch_related('publish') # 支持放多个外键字段 print(res) # 查询外键字段,子查询 for i in res: print(i.publish.name) # 子查询查询一次,一条sql语句 print(i.title) # 子查询查询一次,一条sql语句
select_related 和 prefetch_related 的区别:
共同点:括号内只能放外键字段,而且外键字段关系只能是一对多、一对一,不能是多很少
不一样点:
结合实际状况,哪一种查询更加好?
select_related 查询须要连表,数据量大可能耗时比较久
prefetc_related 查询多张表,数据量大可能查询次数多一点,可是时间较快
字段参数choices能够按照提早设计好的对应关系,存取对应真正的数据
models.py: class User(models.Model): user = models.CharField(max_length=64) pwd = models.IntegerField() gender_choices = ( (1,'男'), (2,'女') ) gender = models.IntegerField(choices=gender_choices) 手动插入数据: id user pwd gender 1 qinyj 123 1 2 jack 123 2 from app01 import models user_obj = models.User.objects.get(pk=1) print(user_obj.get_gender_display())
只要是choices字段类型,在获取值的时候须要这样写:get_字段名_display()