Odoo: метод cron блокирует запись атрибута элемента со ссылкой ir.cron - PullRequest
0 голосов
/ 06 октября 2019

У меня есть cron, который вызывает метод my_cron_method (), определенный таким образом (упрощенно):

class MyModel(models.Model):
  model_cron_id = fields.Many2one('ir.cron', 'Cron Scheduled Action')

  def my_cron_method(self):
    object_list = self.env['my.model']
    for object in object_list:
      print('ck_1')
      object.att_a = 123
      self.update_obj(object)
      print('ck_4')

  def update_obj(self, object):
    print('ck_2')
    object.att_b='abc'
    print('ck_3')
    return

Результат при выполнении cron:

ck_1
ck_2

, поэтому метод "freeses "at object.att_b = 'abc' row.

Это происходит только в том случае, если значение model_cron_id равно значению;если object_list имеет два элемента, а valorized - второй, первый полностью разработан.

Я использую отладку PyCharm, чтобы следовать пошаговому выполнению, и когда я подтверждаю выполнение строки, он блокируется, ничего больше не делая.

Я пытался приостановить выполнение на шаг раньше и выполнить на консоли object._write({'att_a' : 123}), и он тоже блокируется. Остальная часть Odoo, кажется, идет хорошо, блокируется только объект на запись.

Если я запускаю cron вручную, все идет хорошо.

Есть идеи?

EDIT

Я добавляю информацию о model_cron_id, потому что я обнаружил, что именно этот элемент создает проблему.

1 Ответ

0 голосов
/ 13 октября 2019

После долгих поисков и с некоторым предложением я пришел к решению или лучше обходного пути.

Я полагаю, проблема в том, что когда в my_cron_method () установлен первый атрибут object.att_a = 123 объект заблокированan это распространяет блокировку на связанный объект cron (тот же, что находится в процессе выполнения).

Следуя этому предложению (https://www.odoo.com/it_IT/forum/help-1/question/how-to-force-commit-in-a-loop-109751) я добавил self.env.cr.commit() после обновления атрибута. Это решаетlock.

Есть еще один аспект, который стоит взять из документации Odoo здесь https://www.odoo.com/documentation/12.0/reference/orm.html#field-access в случае, если нужно обновить несколько атрибутов: используйте .write(), чтобы обновить все атрибуты сразу.

Полное решение таково:

class MyModel(models.Model):
  att_a = fields.Integer('Attr_a')
  att_b = fields.Char('Attr_b')
  att_c = fields.Char('Attr_c')
  model_cron_id = fields.Many2one('ir.cron', 'Cron Scheduled Action')

  def my_cron_method(self):
    object_list = self.env['my.model']
    for object in object_list:
      object.att_a = 123
      self.env.cr.commit()
      self.update_obj(object)

  def update_obj(self, object):
    object.write({'att_b': 'abc', 'att_c': 'def'})
    return
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...