目录
ORM查询优化
only与defer
res = models.Book.objects.all()
这样是不会有任何返回结果,因为ORM是惰性查询,减少不必要的数据库操作,降低数据库的压力。
也就是说能少走一次数据库就少走一次,最好是一次数据库都不要走或者说之走一次。
only优化:
res = models.Book.objects.only('title') # 括号内查询的字段可以有多个
print(res) # 查询一次,打印一条sql查询语句
for i in res:
print(i.title) # 查询一次,打印一条sql查询语句
print(i.price) # 有几个对象,就查询几次,打印几条sql查询语句
only会把括号内字段对应的值,封装到查询返回的对象中,通过对象点括号字段,不需要再走数据库查询,直接返回结果,一旦你点了不是括号内的字段 就会频繁的去走数据库查询
defer优化
res = models.Book.objects.defer('title')
# print(res)
for i in res:
# print(i.title)
print(i.title)
和 only相反,defer会将括号内的字段排除之外将其他字段对应的值, 直接封装到返回给你的对象中, 点其他字段 不需要再走数据库查询,一旦你点了括号内的字段就会有多少值,就会查询几次
select_related和prefetch_related
select_related优化
res = models.Book.objects.select_related('publish')
# print(res)
for i in res:
print(i.publish)
select_related括号内放外键字段,并且外键字段的类型只能是一对一和一对多,不能是多对多,
内部自动做联表操作,会将括号内外键字段所关联的表与当前表自动拼接成一张表,然后将表中的数据一个个查询出来封装成一个个的对象。 这样做 就不会重复的走数据库,减轻数据库的压力。
select_related括号内可以放多个外键字段,用逗号给开,会将多个外键字段关联的表拼接成一张大表
prefetch_related优化
res = models.Book.objects.prefetch_related('publish','authors')
for i in res:
print(i.publish)
- prefetch_related内部是子查询,会自动按照步骤查询多张表,然后将查询的结果封装到对象中,这样给用户的感觉还是联表操作。
- 括号内支持传多个外键字段,并且没有类型限制。
- 每放一个外键字段,就会多走一条sql语句,多查询一张表
MTV与MVC模型
django号称是MTV模型,其实本质上还是MVC模型
MTV:models templates views
MVC:models views controller(路由匹配)
choices参数
choices = (
(1,'male'),
(2,'female'),
(3,'others')
)
gender = models.IntegerField(choices=choices)
from app01 import models
user_obj = models.Userinfo.objects.filter(pk=4).first()
print(user_obj.username)
print(user_obj.gender)
# 针对choices字段 如果你想要获取数字所对应的中文 你不能直接点字段
# 固定句式 数据对象.get_字段名_display() 当没有对应关系的时候 该句式获取到的还是数字
print(user_obj.get_gender_display())