Odoo 性能
作者:互联网
性能优化
预提取
# 1. 目的 减少SQL的查询次数
# 2. self是数据集合,当第一次时,就把所有的数据都给查询出来。 缓存下来,之后在循环的值都是从缓存中获取的
# 预提取的方式
1. 查询数据库,将查询的数据进行 python列表推导式,获得多个记录值。通过browse一次查询。即可达到预提取
2. 通过上下文预提取传递字段来控制预提取字段。
with_context(prefetch_fields=[预提取字段列表])
with_context(prefetch_fields=False) # 禁止预提取
3. 在 with_prefetch() 方法传递prefetch字典进行实现。 将数据分割成两部分
# recordset._prefetch 属性 可以知道预提取的上下文。 包含一个字典,以模型名为键名,记录id列表为值
prefetch = self.env['base']._prefetch.
recordset1 = a[:5].with_prefetch(prefetch) # a 是记录集,针对a记录集合,进行预提取
recordset2 = a[5:].with_prefetch(prefetch)
内存缓存 ORMCACHE
# ormcache 缓存装饰器
from odoo import tools
@tools.ormcache('mode') # 传入参数名 ,字段缓存。
def fetch_mode_data(self,mold):
pass
@tools.ormcache('self.env.uid','mode') # 缓存时,存在以来环境属性
def fetch_mode_data(self,mold):
pass
# ormcache_context # 依赖于上下文的值。需要传入上下文键列表,keys是缓存上下文中的字段
@tools.ormcache_context('mode',keys=('website_id','lang'))
def fetch_data(self,mode):
pass
# ormcache_multi 缓存多条记录或ID执行操作
@tools.ormcache_multi('mode',multi='ids') # ids 是记录集
def fetch_data(self,mode,ids):
pass
### ORM缓存 以字典格式缓存保存。
使用x, y 参数调用该方法时且该方法的结果为x+y,缓存查询即为{(x, y): x+y}
### 清楚缓存
self.env[model_name].clear_caches()
生成图像缩略图
# image_resize_images() 方法有助于管理3中不同大小的图像
image = fields.Binary(attachment=True) # 1024x1024px
image_medium = fields.Binary(attachment=True) # 128x128px
image_small = fields.Binary(attachment=True) #64x64px
# 使用方法 , 分别保存在 iamge , image_medium 和 iamge_small
@api.model
def create(self,vals):
tools.image_resize_images(vals)
return super().create(vals)
def write(self,vals):
tools.image_resize_images(vals)
return super().write(vals)
# 其他方法
image_resize_image(): 该方法用于从base64源调整图像的大小。
image_resize_and_sharpen(): 创建缩略图有时会让图像变得模糊。在这种情况下,你可以使用这个函数来锐化图像以让图像更美观。
image_save_for_web(): 这个函数用于为网站优化图像大小。它会减少图像大小而又不影响其精度。
crop_image(): 这个方法用于将图像剪切为不同尺寸。
image_colorize(): 这个方法用于为图像的透明部分上色。
分组过滤read_group
# read_group()方法广泛用于数据统计和智能统计按钮
def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
pass
# domain : domain 是用于过滤记录, 搜索条件
# fields 分组获取字段的列表 , 支持sql聚合函数('total:sum(amount_total)')
self.env['sale.order'].read_group([], ['partner_id', 'total:sum(amount_total)', 'avg_total:avg(amount_total)'], ['partner_id'])
# groupby 分组字段记录
# offset 分页
# limit 限制数量
# lazy 该参数为True,结果会在groupby参数中仅通过第一个字段来进行分组,果中你会在__context和__domain键中获取到剩余的groupby参数及domain。 该参数值设为False,它会用groupby参数中的所有字段对数据进行分组。
# 拓展 日期分组 groupby_function
可以根据日、周、季度、月或年来对记录进行分组
self.env['sale.order'].read_group([], ['total:sum(amount_total)'], ['order_date:month'])
创建和写入多条记录
通过数据库查询访问记录
self._cr.execute方法来执行数据库查询
标签:缓存,性能,prefetch,image,Odoo,total,self,mode 来源: https://www.cnblogs.com/dengz/p/14582187.html