Как запустить вычисления для существующей записи odoo

#odoo

#odoo

Вопрос:

Мне было добавлено поле с именем commission_total , оно получает идентификатор записи в качестве вычисляемого поля commission_total, оно хорошо работало при изменении любого из зависимых полей, но мне нужно запускать функцию для всех старых дат, а не при создании нового изменения поля depends

 @api.depends('agents','order_line')
def _compute_commission_total(self):
    total = 0
    for agent in self.agents:
        total  = agent.agent_commission
    self.commission_total = total
    _logger.info("COmmisssion total                            ")
    _logger.info(self.commission_total)
  

Комментарии:

1. Помимо хорошего ответа kerberos: вы должны изменить метод вычисления, используя цикл for on self , потому что его ответ не будет работать без этого.

2. @CZoellner. Я хочу написать действие сервера в своем пользовательском модуле? Я не хочу создавать вручную. Когда я обновляю модуль, я хочу пересчитать. Спасибо

Ответ №1:

вы могли бы использовать действие сервера Odoo, расположенное по следующему пути

 Settings → Technical → Actions → Server Actions
  

создайте новое действие и убедитесь, что для модели поля установлена правильная модель, для действия в поле установлено значение Выполнить код Python, поле кода Python будет вашим кодом. что было бы примерно следующим:

 all_records = env['Model Name'].search([('Add the preferred domain')]) # you will get all records
for item in all_records:
    item._compute_commission_total()


# or as suggested by @Dipen Shah, you could use
# word `records` as it's available in the context
for item in records:
    item._compute_commission_total()
  

пожалуйста, обратите внимание, что в контексте доступны следующие переменные:

  • env: среда Odoo, в которой запускается действие
  • модель: модель Odoo записи, для которой запускается действие; является недействительным набором записей
  • запись: запись, для которой выполняется действие; может быть недействительной
  • записи: набор записей всех записей, для которых действие запускается в многорежимном режиме; может быть недействительным
  • полезные библиотеки Python, такие как time, datetime, dateutil, timezone
  • log: log(message, level=’info’): функция ведения журнала для записи отладочной информации в таблицу ir.logging
  • Предупреждение: предупреждение об исключении для использования с raise

если вы хотите, чтобы такое действие было исходным кодом в вашем модуле. это будет XML-файл. это может быть в data папке. это будет выглядеть так:

  <record id="action_to_recompute_fields" model="ir.actions.server">
  <field name="name">Recompute the fields</field>
  <field name="type">ir.actions.server</field>
  <field name="model_id" ref="model_YOUR_MODEL_NAME"/>
  <field name="state">code</field>
  <field name="code">
for item in records:
    item._compute_commission_total()
  </field>
</record>
  

или вы могли бы сделать это как Scheduled Actions

согласно вашему последнему комментарию, если вы хотите применить это к существующей производственной базе данных, из вашего модуля, а не вручную. вы должны использовать управление версиями модуля, которое находится в __manifest__.py файле. таким образом, вы увеличите номер версии вашего модуля. затем добавьте migrations папку, как предложено на следующем веб-сайте: https://odoo-development.readthedocs.io/en/latest/maintenance/data-migration.html

вы могли бы попробовать это. дайте нам знать, работает ли это.

Комментарии:

1. При действии на сервере вы можете лучше использовать с записями, и из них напрямую вы можете запустить метод. Нет необходимости заново создавать среду и выполнять поиск оттуда.

2. Я хочу написать действие сервера в своем пользовательском модуле? Я не хочу создавать вручную. Когда я обновляю модуль, я хочу пересчитать. Спасибо

3. Как мы можем вызвать функцию вычисления для всех записей из миграции? Предположим, я не могу делать то, что хочу, только с помощью sql-запроса.

Ответ №2:

Способ пересчета поля заключается в:

  1. Удалите соответствующий столбец базы данных. Вы можете использовать psql для выполнения команды ALTER TABLE,
  2. Запустите обновление модуля.

Я считаю, что это легче запомнить и, если у вас есть доступ к базе данных, проще реализовать.

Комментарии:

1. Я хочу написать действие сервера в своем пользовательском модуле? Я не хочу создавать вручную. Когда я обновляю модуль, я хочу пересчитать. Спасибо

2. Я хочу создавать только из своего пользовательского модуля. Спасибо

3. Это необходимо только при разработке модуля, пока вы не получите правильный код вычисления. Не требуется для развертывания, так как столбец будет естественным образом создан и заполнен при установке или обновлении. Так что нет, вам не нужно создавать какое-то серверное действие для этого.