在odoo 10中,我有一个线程调用一个使用self.env来调用模型的方法。但是当系统不让我占用这个并抛出这样的异常时:
Exception in thread Thread-44:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "/home/kunder/proyectos/odoo/addons/kunder_odoo_comercionet/models/models.py", line 97, in update_quotations_thread
quotation_list = self.download_comercionet_docs();
File "/home/kunder/proyectos/odoo/addons/kunder_odoo_comercionet/models/models.py", line 370, in download_comercionet_docs
new_last_date_db = (self.env["ftp_orders.settings"]).search([])[0].last_date
File "/home/kunder/proyectos/odoo/odoo/models.py", line 1508, in search
res = self._search(args, offset=offset, limit=limit, order=order, count=count)
File "/home/kunder/proyectos/odoo/odoo/models.py", line 4193, in _search
self.sudo(access_rights_uid or self._uid).check_access_rights('read')
File "/home/kunder/proyectos/odoo/odoo/models.py", line 4842, in sudo
return self.with_env(self.env(user=user))
File "/home/kunder/proyectos/odoo/odoo/api.py", line 781, in __call__
return Environment(cr, uid, context)
File "/home/kunder/proyectos/odoo/odoo/api.py", line 726, in __new__
env, envs = None, cls.envs
File "/home/kunder/proyectos/odoo/odoo/tools/func.py", line 111, in __get__
return self.fget.__get__(None, owner)()
File "/home/kunder/proyectos/odoo/odoo/api.py", line 699, in envs
return cls._local.environments
File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 72, in __getattr__
raise AttributeError(name)
AttributeError: environments
我处理模型中的线程,我处理线程的方式是:
def thread_method(self):
#This method call other model like this and do some other stuff
self.env['sale.order'].search([])
def main_method(self):
threading.Thread(target = self.method_thread).start()
我正在调试代码,如果我坐在main_method上,它有与thread_method相同的对象self.env,所以我不明白为什么它不起作用。
如何在线程中请求其他模型?
由于
答案 0 :(得分:4)
对于线程方法,您需要创建自己的环境
from openerp import models, api
from openerp.modules.registry import Registry
def threaded_method(self):
with api.Environment.manage():
选中此项以获取更多https://github.com/odoo/odoo/blob/10.0/addons/stock/wizard/procurement_orderpoint_compute.py#L21
答案 1 :(得分:3)
你可以找一个如何在Odoo插件的procurement_orderpoint_compute.py文件中启动一个线程的例子。
def _procure_calculation_orderpoint(self):
with api.Environment.manage():
# As this function is in a new thread, I need to open a new cursor, because the old one may be closed
new_cr = self.pool.cursor()
self = self.with_env(self.env(cr=new_cr))
scheduler_cron = self.sudo().env.ref('procurement.ir_cron_scheduler_action')
# Avoid to run the scheduler multiple times in the same time
try:
with tools.mute_logger('odoo.sql_db'):
self._cr.execute("SELECT id FROM ir_cron WHERE id = %s FOR UPDATE NOWAIT", (scheduler_cron.id,))
except Exception:
_logger.info('Attempt to run procurement scheduler aborted, as already running')
self._cr.rollback()
self._cr.close()
return {}
self.env['procurement.order']._procure_orderpoint_confirm(
use_new_cursor=new_cr.dbname,
company_id=self.env.user.company_id.id)
new_cr.close()
return {}
或者如果您考虑使用OCA queue
,可能会更好答案 2 :(得分:0)
new_cr = self.pool.cursor()
self = self.with_env(self.env(cr=new_cr))
pdb.set_trace()
id_data=self.env['cw.test.module'].create({'name':self.id})
id_data.master_data()
new_cr.commit()
new_cr.close()
使用new_cr.commit()
提交新光标