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方法来执行数据库查询
原文地址:https://www.cnblogs.com/dengz/p/14582187.html