Before when we do `reserved(records)`, it iterates in a reverse order of `records`. Unfortunately, the `__reserved__` method don't exist explicitly in BaseModel then Python fallback on its own implementation using `__getitem__` and `__len__` (coming from Sequence): https://github.com/python/cpython/blob/3.10/Lib/_collections_abc.py#L1047-L1049 Because it uses __getitem__, it breaks the prefetch of the recordset. Example: ------------- ``` partners = self.env['res.partner'].browse(1, 2, 3, 4, 5) for partner in reversed(partners): partner.name ``` will generate 5 SQL requests to fetch data (one by record) Then create our own `__reversed__` and handle the prefetch correctly (like `__iter__`). Now in the example it will correctly generate only 1 SQL request because of the prefetch. task-2687953 closes odoo/odoo#79622 Signed-off-by: Raphael Collet <rco@odoo.com> Co-authored-by: rco-odoo <rco@odoo.com>