How to Implement prefetch_fields Optimization in Modern Odoo (v15+ and above) ?
✅ What is prefetch_fields?
In Odoo, the ORM preloads fields to reduce queries during recordset access. However, in large datasets or performance-critical tasks, this can cause unnecessary memory usage or slower performance.
To control this behavior, Odoo supports disabling or customizing prefetching via:
self.with_context(prefetch_fields=False)
📌 Realistic Odoo Examples
1. Disable Prefetching Entirely
partners = self.env['res.partner'].with_context(prefetch_fields=False).search([('is_company', '=', True)])
for rec in partners:
logger.info(rec.id)
- This disables automatic field loading.
- Only rec.id is fetched from the DB unless other fields are explicitly accessed.
Suitable for large recordsets where only a few fields are needed.
2. Prefetch Only Specific Fields
partners = self.env['res.partner'].with_context(prefetch_fields=['id', 'name']).search([('is_company', '=', True)])
for rec in partners:
logger.info(rec.name)
- Only the listed fields (id, name) are preloaded.
- Improves performance when full field data is not required.
🧠 When to Use
Scenario | Use prefetch_fields? |
Background jobs or scripts processing 10k+ records | ✅ Yes — optimize memory and I/O |
API endpoints returning minimal data | ✅ Yes — restrict to needed fields |
Accessing computed/image/relational fields | ❌ No — allow prefetch to avoid repeated queries |
Regular UI and business logic | ❌ Not necessary |
⚠️ Common Mistake
# ❌ Deprecated in newer versions:
self.with_prefetch_fields(False)
- Replaced with with_context(prefetch_fields=False) in newer versions like Odoo 15+.
✅ Summary Table
Context Code | Behavior |
with_context(prefetch_fields=False) | No prefetching — fetch only when needed |
with_context(prefetch_fields=['id', 'name']) | Only prefetch specified fields |
No context | Default ORM prefetches most fields |