ORM语句的特点
惰性查询:如果仅仅是编写了orm语句,后面没用到该语句查询出来的参数,那么orm会自动识别,不发起sql查询语句。(只有使用了才会去数据库查询数据)
1: only和defer
# res = models.Book.objects.all()
res = models.Book.objects.only('title') #
print(res.title) # 不会走数据库
print(res.authors) # 走数据库
"""
查询only括号里面的字段不会重新走数据库,
而only括号里面没有的字段会重新走数据库查询
"""
res = models.Book.objects.defer('title')
print(res.title) # 会走数据库
print(res.authors) # 不走数据库
"""
defer和only相反
"""
2:select_related 和 prefetch_related
res = models.Book.objects.select_related('publish')
"""
(内部实现是联表查询)
select_related内部先将book和publish表连起来,
然后一次性将大表中的所有数据封装给查询出来的对象。
这时候对象点book表中数据还是publish表中数据都不需要再走数据库查询了
注:select_related中只能放外键字段,而且表关系只能是一对一或者一对多,多对多不行。
"""
res = models.Book.objects.prefetch_related('publish')
"""
(内部实现是子查询)
将子查询查询的结果封装到对象中
"""