Существует 3 класса, sync.test.subject.a
, который имеет многого отношения с sync.test.subject.b
, которое унаследовано sync.test.subject.c
.Как обновить другие поля или другие модели изнутри функции вычисления?
sync.test.subject.b
«ы separated_chars
поле заполняется через функцию вычислительном под названием _compute_separated_chars
который запускается изменением sync.test.subject.b
» chars
поле с.
Роль sync.test.subject.c
состоит в том, чтобы установить chars
самостоятельно name
так, чтобы срабатывал _compute_separated_chars
.
Проблема заключается в том, что я не могу удалить оставшиеся записи, связанные с полем Many2many (а именно sync.test.subject.a
оставшихся записями) изнутри функции вычисления, потому что, прежде чем функция будет выполнена, поле уже освобождено системой, t получить идентификаторы. Я не могу даже использовать временное поле для хранения sync.test.subject.a
ids, потому что любые изменения, которые не связаны с separated_chars
, не будут передаваться системой изнутри функции вычисления (при любых изменениях я имею в виду действительно ЛЮБЫЕ изменения либо в другие поля из такая же модель или другие изменения в других моделях не будут совершены). Как я могу это решить?
Модель:
from openerp import models, fields, api, _
class sync_test_subject_a(models.Model):
_name = "sync.test.subject.a"
name = fields.Char('Name')
sync_test_subject_a()
class sync_test_subject_b(models.Model):
_name = "sync.test.subject.b"
chars = fields.Char('Characters')
separated_chars = fields.Many2many('sync.test.subject.a',string='Separated Name', store=True, compute='_compute_separated_chars')
@api.one
@api.depends('chars')
def _compute_separated_chars(self):
a_model = self.env['sync.test.subject.a']
if not self.chars:
return
self.separated_chars.unlink()
#DELETE LEFTOVER RECORDS FROM a_model
for character in self.chars:
self.separated_chars += a_model.create({'name': character})
sync_test_subject_b()
class sync_test_subject_c(models.Model):
_name = "sync.test.subject.c"
_inherit = "sync.test.subject.b"
name = fields.Char('Name')
@api.one
def action_set_char(self):
self.chars = self.name
sync_test_subject_c()
Просмотры:
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<!-- Top menu item -->
<menuitem name="Testing Module"
id="testing_module_menu"
sequence="1"/>
<menuitem id="sync_test_menu" name="Synchronization Test" parent="testing_module_menu" sequence="1"/>
<!--Expense Preset View-->
<record model="ir.ui.view" id="sync_test_subject_c_form_view">
<field name="name">sync.test.subject.c.form.view</field>
<field name="model">sync.test.subject.c</field>
<field name="type">form</field>
<field name="arch" type="xml">
<form string="Sync Test" version="7.0">
<header>
<div class="header_bar">
<button name="action_set_char" string="Set Name To Chars" type="object" class="oe_highlight"/>
</div>
</header>
<sheet>
<group>
<field string="Name" name="name" class="oe_inline"/>
<field string="Chars" name="chars" class="oe_inline"/>
<field string="Separated Chars" name="separated_chars" class="oe_inline"/>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="sync_test_subject_c_tree_view">
<field name="name">sync.test.subject.c.tree.view</field>
<field name="model">sync.test.subject.c</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<tree string="Class">
<field string="Name" name="name"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="sync_test_subject_c_search">
<field name="name">sync.test.subject.c.search</field>
<field name="model">sync.test.subject.c</field>
<field name="type">search</field>
<field name="arch" type="xml">
<search string="Sync Test Search">
<field string="Name" name="name"/>
</search>
</field>
</record>
<record id="sync_test_subject_c_action" model="ir.actions.act_window">
<field name="name">Sync Test</field>
<field name="res_model">sync.test.subject.c</field>
<field name="view_type">form</field>
<field name="domain">[]</field>
<field name="context">{}</field>
<field name="view_id" eval="sync_test_subject_c_tree_view"/>
<field name="search_view_id" ref="sync_test_subject_c_search"/>
<field name="target">current</field>
<field name="help">Synchronization Test</field>
</record>
<menuitem action="sync_test_subject_c_action" icon="STOCK_JUSTIFY_FILL" sequence="1"
id="sync_test_subject_c_action_menu" parent="testing_module.sync_test_menu"
/>
</data>
</openerp>
Я думаю, что это поведение вызвано ленивым осуществлением Odoo для обработки цепи, вычисленное поля триггеров вместо обработки спусковых правильно (последовательно на основе зависимости), они просто обновляют КАЖДЫЕ вычисленные поля EVERYTIME, есть изменения для КАЖДОГО ДРУГОГО ПОЛЯ. И из-за этого они ограничивают любое обновление любым другим полем внутри функции вычисления. Потому что, если они этого не сделают, он взорвется вызовом функции рекурсивного вычисления.
Андрей, ты мужчина! Ха-ха. Я никогда не думал использовать низкоуровневые SQL-запросы. Причина, по которой я использую отношение Many2many из-за этой проблемы: http://stackoverflow.com/questions/29962101/is-it-possible-to-make-a-one2many-relation-without-specifying-the-target-models , Наследование Odoo отличается от наследования Java, я не знаю, как закодировать суперкласс с одним полем, которое может быть унаследовано подклассами. Таким образом, я решил использовать many2many отношение, которое работает хорошо, пока я не попал в эту проблему. – William
Но мне все равно нужно изменить ваше решение, так как таблица * меняется каждый раз, когда я расширяю суперкласс *! – William
Итак, проблема у вас в другом месте :) Я отвечу на другой вопрос. В наследовании Odoo есть делегирование - не используйте наследование класса Python, вместо этого используйте Odoo _inherit = '....'. –