2016-12-16 2 views
0

Я определил новое поле модели product.product с использованием пользовательского интерфейса в Odoo V10. Поле определяется следующим образом:Относительно связанное с Одуо поле, если store = True

Name = x_sellable_inventory 
Type = float 
Readonly = true 
Dependencies = qty_available,outgoing_qty 

метод Compute является:

for record in self: 
    record['x_sellable_inventory'] = record.qty_available - record.outgoing_qty 

Я добавил в этом поле зрения, и подтвердил, что это правильно меняется, если инвентарный корректируется на продукт под рукой , Пока все работает как ожидалось.

Теперь, я хочу иметь доступ к этому значению из sale.order.line, поэтому я создал связанное поле на sale.order.line, чтобы получить к нему доступ. Он определяется следующим образом:

Name = x_product_sellable_inventory_new 
Type = float 
Readonly = true 
Stored = true 
Related Field = product_id.x_sellable_inventory 

Затем я добавил в этом поле зрения продажи заказа, чтобы я мог видеть его в списке строк заказа. Он появляется один раз для каждой строки заказа в дереве.

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

Если я снижу флажок Store, значение будет обновлено правильно. Что здесь происходит? Почему имеет значение, если связанная область хранится или нет? Не следует ли обновляться при изменении значения product_id.x_sellable_inventory?

ответ

0

Я думаю, что мои вопросы здесь было то, что поля, я пытался использовать в качестве зависимостей были не stored сами. Кажется, что поля должны храниться для правильной работы в качестве зависимостей, что имеет смысл. Модель не имеет способа узнать, что зависимое поле изменилось, если оно не является полем, которое хранится в базе данных. qty_available и outgoing_qty не сохранены.

2

Вычисляемые поля не сохраняются по умолчанию. Что вы знаете. Это вызывает проблемы, когда вы хотите выполнять функции, которые требуют, чтобы данные были доступны в базе данных.

Чтобы исправить это, Odoo предоставляет флаг store = True в вычисленном поле.

gotcha является то, что он только срабатывает один раз. Чтобы обойти это, вам нужно использовать декоратор @api.depends (как заявили @danidee и @CZoellner), чтобы ваше поле обновлялось каждый раз, когда изменилось связанное с ним поле или поля.

@api.depends также может получать список имен полей, разделенных запятыми.

@api.depends('field_name')

ИЛИ

@api.depends('field_name','another_field_name')

@api.one 
@api.depends('field2') 
def _compute_field1(self): 
    self.field1 = SOMETHING THAT OCCURS EVERY TIME `field2` CHANGES 


field1 = fields.Char(compute=_compute_field1,store=True) 
field2 = fields.Char() 
+0

спасибо. Я спрашиваю о поле 'related', а не' computed'. Это имеет значение? Согласно этим документам: http://odoo-new-api-guide-line.readthedocs.io/en/latest/fields.html#related-field говорит: «Настройка store kwarg автоматически сохранит значение в базе данных. С новым API значение связанного поля будет автоматически обновляться, сладкое ». Что мне здесь не хватает?Кроме того, не означает ли ваш ответ, что зависимости от вычисленных полей не имеют значения, если 'store = True'? Поскольку поле никогда автоматически не перекомпонует себя, изменения зависимостей не влияют. – flyingL123

+0

Я не уверен, правильны ли документы или нет. Однако я считаю, что принцип все еще стоит. Вы должны иметь возможность обновлять поле, которое хотите, используя некоторые варианты этого обходного пути. Я понимаю, что store = True только один раз срабатывает. Независимо от того, что говорят документы. –

+0

Значит ли зависимости нецелесообразно использовать для сохраненного вычисленного поля? Я новичок в Odoo, пытаясь изучить все эти тонкости. Спасибо за помощь. – flyingL123