Hello,
I have an issue with one2many field, please review this example code:
Model:
class ParentModel(models.Model):
_name = 'parent.model'
parent_field = fields.Char(compute='_compute_parent_field')
children_ids = fields.One2many('child.model', 'parent_id', string='Children')
@api.depends('children_ids.child_field')
def _compute_parent_field(self):
for record in self:
# Custom logic to compute parent_field based on child_field
record.parent_field = 'Computed Value' if record.children_ids else 'Default Value'
class ChildModel(models.Model):
_name = 'child.model'
parent_id = fields.Many2one('parent.model', string='Parent')
related_parent_field = fields.Char(related='parent_id.parent_field')
child_field = fields.Char()
View:
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="parent_model_form" model="ir.ui.view">
<field name="name">parent_model_form</field>
<field name="model">parent.model</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="parent_field"/>
</group>
<notebook>
<page string="Children">
<field name="children_ids">
<tree>
<field name="child_field"/>
<field name="related_parent_field"/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
</data>
</odoo>
The child_field change value is properly computed, parent_field is updated and displayed in the parent.
The related_parent_field is also updated and displayed for the current child record.
The problem is the other child records are not updated.
When I edit other child records, I see the old value of related_parent_field.
I have to save the parent record to see the changes in other child records.
Hope you can help me with this issue.
Thanks in advance.
Here's a more concrete example that clearly demonstrates the issue:
```python
# Models
class ProductCategory(models.Model):
_name = 'product.category'
_description = 'Product Category'
name = fields.Char(string='Category Name', required=True)
total_products = fields.Integer(string='Total Products', compute='_compute_total_products')
product_ids = fields.One2many('product.product', 'category_id', string='Products')
@api.depends('product_ids.active')
def _compute_total_products(self):
for category in self:
category.total_products = len(category.product_ids.filtered(lambda p: p.active))
class Product(models.Model):
_name = 'product.product'
_description = 'Product'
name = fields.Char(string='Product Name', required=True)
active = fields.Boolean(string='Active', default=True)
category_id = fields.Many2one('product.category', string='Category')
category_total = fields.Integer(related='category_id.total_products', string='Products in Category')
```
```xml
<!-- Product Category Form View -->
<record id="product_category_form_view" model="ir.ui.view">
<field name="name">product.category.form</field>
<field name="model">product.category</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="name"/>
<field name="total_products"/>
</group>
<notebook>
<page string="Products">
<field name="product_ids">
<tree>
<field name="name"/>
<field name="active"/>
<field name="category_total"/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
```
## Steps to Reproduce the Issue:
1. Create a new Product Category "Electronics"
2. Add three products to this category: "Laptop", "Phone", "Tablet"
3. Notice that `total_products` shows 3 and all products show `category_total = 3`
4. Edit the first product "Laptop" and uncheck the "Active" box
5. Notice that:
- The `total_products` on the category updates correctly to 2
- The `category_total` on the "Laptop" product updates correctly to 2
- But the `category_total` on "Phone" and "Tablet" still shows 3 (incorrect)
6. Only after saving the form, the `category_total` value on all products updates correctly
This example clearly shows how field changes in one record (deactivating a product) correctly trigger computed fields in the parent (category.total_products), but the related fields in sibling records don't refresh automatically without saving.