Django QuerySet缓存机制:get()方法的查询时机与缓存规则
Django中get()方法的查询触发与缓存规则
核心特性说明
get()方法和QuerySet的惰性执行逻辑完全不同:调用MyModel.objects.get(id=1)的瞬间就会触发数据库查询,直接返回对应的模型实例,不会返回QuerySet对象,自然也就没有QuerySet那种"首次迭代才查DB"的惰性行为。- 在同一个API GET请求的生命周期内,默认情况下每次调用
MyModel.objects.get(id=1)都会重新命中数据库。因为每次调用都会生成一个全新的QuerySet实例并立即执行查询,Django不会自动在请求级别缓存这个查询的结果。
避免重复查询的实用方式
如果想在同一个请求里复用查询结果,不用每次都查DB,有几种简单的处理方式:
- 把查询结果赋值给一个变量,在请求周期内复用这个变量:
# 只查一次DB my_obj = MyModel.objects.get(id=1) # 后续直接用变量,不再查DB print(my_obj.name) process_obj(my_obj) - 借助Django自带的缓存框架手动缓存结果,或者使用
django-cacheops这类第三方工具实现模型查询的自动缓存 - 如果涉及关联对象查询,可以用
select_related或prefetch_related预取关联数据,减少重复查询
和QuerySet缓存的区别对比
- QuerySet是惰性对象,只有在首次迭代(比如遍历、转换为列表、调用
len()等)时才会触发DB查询,之后会把结果缓存起来,后续操作直接复用缓存 get()方法本质是对QuerySet做了filter().first()的封装,调用时会立即执行查询并返回单个实例,没有内置的请求级缓存机制
内容的提问来源于stack exchange,提问作者HIT_girl
相关产品推荐
相关产品推荐

