Hello Fakhri,
This is due to because the children are linked to the original parent by Id. Like you say I think the best way to do this would be to override the copy function on the parent object and then search for all children which relate to the original parent. Then for each child, duplicate and change the many2one to link to the new record which you have just duplicated.
Here is an example for duplicating a parent and copy all CRM records from the old to new:
class odoo_help_4(models.Model):
_inherit = "res.partner"
def copy(self, default=None):
new = super(odoo_help_4, self).copy(default=default)
# get all deals which are equal to old
all_crms = self.env["crm.lead"].search([("partner_id", "=", self.id)])
# duplicate all deals and change the partner_id to the new id
for crm in all_crms:
crm.copy({"partner_id": new.id})
return new
I hope this helps,
Thanks,