我有这种计算方法,可以计算6个字段和总计。 有用。 问题是如何在性能和代码质量方面优化它。 只是想获得有关如何编写更好的代码的建议。
def _ocnhange_date(self):
date = datetime.datetime.now().strftime ("%Y-%m-%d %H:%M:%S")
self.date = date
self.drawer_potential = self.drawer_id.product_categ_price * self.drawer_qty
self.flexible_potential = self.flexible_id.product_categ_price * self.flexible_qty
self.runner_potential = self.runner_id.product_categ_price * self.runner_qty
self.group_1_potential = self.group_1_id.product_categ_price * self.group_1_qty
self.group_2_potential = self.group_2_id.product_categ_price * self.group_2_qty
self.group_3_potential = self.group_3_id.product_categ_price * self.group_3_qty
total = [self.drawer_potential,self.flexible_potential,self.runner_potential,self.group_1_potential,
self.group_2_potential,self.group_3_potential]
self.total_potentail = sum(total)
答案 0 :(得分:2)
第一件事:您应该主要考虑批处理操作的性能。您的案例是onchange方法,这意味着:
因此,基本上,这不是您模块中的关键瓶颈。
但是,您正在问如何将其变得更好,所以就到这里了。这只是一个想法,在某些方面有所不同(不是更好),但是通过这种方式,您可能会在自己喜欢的某个地方看到不同的方法:
def _ocnhange_date(self):
# Use this alternative method, easier to maintain
self.date = fields.Datetime.now()
# Less code here, although almost equal
# performance (possibly less)
total = 0
for field in ("drawer", "flexible", "runner",
"group_1", "group_2", "group_3"):
potential = self["%s_id"].product_categ_price * self["%s_qty"]
total += potential
self["%s_potential"] = potential
# We use a generator instead of a list
self.total_potential = total
答案 1 :(得分:1)
我只看到您可以在此处改进的两件事:
使用Odoo的Datetime
类获取“现在”,因为它已经考虑了Odoo的日期时间格式。最后,它更易于维护,因为如果Odoo决定在整个系统范围内更改整个格式,那么您也必须更改方法。
尝试避免这么多分配,而是使用允许组合更新某些值的方法。对于onchange方法,该值为update()
,对于其他值更改,其值为write()
。
def _onchange_date(self):
self.update({
'date': fields.Datetime.now(),
'drawer_potential': self.drawer_id.product_categ_price * self.drawer_qty,
'flexible_potential': self.flexible_id.product_categ_price * self.flexible_qty,
# and so on
})