Ad – 728×90
🎨 Odoo Studio

Adding Custom Fields in Odoo Studio – No Python Required

One of Studio's most practical capabilities is adding new fields to any existing Odoo model without touching Python. You choose the field type, configure its properties in the right panel, and Studio creates the underlying database column and field definition automatically. This page covers all available field types, their properties, relational fields, formula (computed) fields, and where your custom fields are stored.

⏱️ 20 min 🎯 Beginner 📅 Updated 2026

Adding a Field with Studio

To add a new custom field to a model:

  1. Open Studio on the relevant app and navigate to the form view of the model you want to extend.
  2. In the left panel, click the Components tab.
  3. Drag the New Field component onto the form canvas and drop it at the position where you want the field to appear.
  4. A dialog appears asking you to choose the field type. Select the appropriate type and click Confirm.
  5. The new field appears on the form. Click it to open its properties in the right panel and set the label, technical name, and other options.
💡
Field technical name

Studio automatically prepends x_studio_ to the technical name of custom fields (e.g., x_studio_internal_ref). You can rename it during creation but the x_ prefix is mandatory for all custom fields — it distinguishes them from Odoo's built-in fields.

Available Field Types

Studio LabelOdoo TypeDescription
TextCharSingle-line text string
Multi-line TextTextMulti-line text area
IntegerIntegerWhole numbers only
DecimalFloatFloating-point number with configurable precision
MonetaryMonetaryCurrency-aware decimal linked to a currency field
DateDateDate only (no time)
Date & TimeDatetimeDate with time component
CheckboxBooleanTrue/False toggle
SelectionSelectionDropdown with fixed options you define
Many2oneMany2oneLink to one record in another model
Tags (Many2many)Many2manyLink to multiple records (tag-style)
One2manyOne2manyList of related records (e.g., order lines)
FileBinaryFile upload / attachment
ImageBinary (image widget)Image upload with thumbnail preview
HTMLHtmlRich text editor field
FormulaInteger/Float/Char/Date (computed)Computed field — value derived from an expression

Field Properties and Options

After adding a field, click it on the canvas to open the Properties panel on the right. Common properties include:

PropertyEffect
LabelThe user-facing name shown next to the field on the form
Technical NameThe field's internal name (must start with x_). Cannot be changed after saving.
Help TooltipExplanatory text shown when the user hovers over the field's question mark icon
RequiredPrevents saving the record without a value in this field
Read-onlyField is visible but cannot be edited by users
CopiedWhether the value is copied when the record is duplicated
Default ValuePre-filled value for new records
IndexCreates a database index for faster search on this field
Ad – 336×280

Relational Fields in Studio

Setting up a Many2one field in Studio is straightforward:

  1. Add a Many2one field as described above.
  2. In the Properties panel, find the Related Model dropdown.
  3. Type to search for the target model name (e.g., "res.partner" for contacts, "product.product" for products).
  4. Select the model and click outside to save.

The field will now display a searchable dropdown pointing to records of the chosen model. You can optionally set a Domain to filter which records appear in the dropdown.

Tags (Many2many) fields

For a Many2many (Tags) field, Studio either creates a new model automatically to hold the tags, or lets you point to an existing model. If you create a new tags model, Studio names it x_<model>_<field>_tag and generates a basic form for managing the tags.

Formula Fields (Computed)

Studio calls computed fields "Formula" fields. To create one:

  1. Add a Formula field from the Components tab.
  2. Choose the return type: Integer, Float, Char, or Date.
  3. In the Properties panel, enter the Expression. Studio uses Python-like syntax with access to the current record via record.

Example expressions:

Python Expression
# Total after discount (on a sale order line)
record.price_unit * record.product_uom_qty * (1 - record.discount / 100)

# Days since record creation
(fields.Date.today() - record.create_date.date()).days

# Concatenate two text fields
(record.partner_id.name or '') + ' – ' + (record.x_studio_department or '')
⚠️
Formula field limitations

Studio formula fields are stored computed fields with store=False by default — they are not written to the database and cannot be searched or grouped by in list/pivot views. For searchable computed fields, you need a custom module with store=True and a @api.depends trigger.

Where Custom Fields Are Stored

Every field you create via Studio is stored as a record in the ir.model.fields model in the Odoo database. You can inspect them in developer mode:

  1. Go to Settings → Technical → Database Structure → Fields.
  2. Filter by model to see all fields including your custom ones.
  3. Custom fields added by Studio have the x_ prefix in their technical name (e.g., x_studio_custom_note).

Because they live in ir.model.fields, custom fields are tied to the database, not to any file on disk. They survive upgrades but are not version-controlled unless you export to a module.

Shell (Odoo shell)
# List all Studio custom fields on sale.order
env['ir.model.fields'].search([
    ('model', '=', 'sale.order'),
    ('name', 'like', 'x_'),
]).mapped('name')
# e.g. ['x_studio_internal_ref', 'x_studio_approval_note']

📋 Key Points

  • Drag a New Field component from the Components tab to add a custom field to any model.
  • All custom fields created by Studio get an x_ prefix (e.g., x_studio_my_field).
  • Available types include Text, Integer, Float, Date, Checkbox, Selection, Many2one, Tags, File, Image, HTML, and Formula.
  • Set properties (required, readonly, help tooltip, default, index) in the right Properties panel.
  • Many2one fields: pick the related model from a dropdown — optionally add a domain filter.
  • Formula fields are computed on-the-fly using Python expressions; not stored by default (not searchable).
  • All custom fields are ir.model.fields records — inspect them via Settings → Technical → Fields.

FAQ

Can I rename or delete a custom field after creating it? +

You can change the label (display name) at any time. However, you cannot rename the technical name (e.g., x_studio_my_field) after the field is created because renaming it would require migrating database column data. To delete a custom field, go to Settings → Technical → Fields, find the field, and delete it. Warning: this will delete all data stored in that column.

Can I add a custom field to Odoo's built-in models like sale.order or res.partner? +

Yes. Studio can add custom fields to any model in Odoo, including core models like sale.order, res.partner, account.move, etc. Open Studio on the relevant app and add the field — it becomes part of that model across all views.

What is the difference between a Formula field and a regular computed field? +

Studio's Formula field is a simplified computed field created without Python code. It is always store=False (not in the database) and compute runs each time the record is read. A Python computed field (in a custom module) can be store=True, have @api.depends for caching, and can be searched or grouped in views. Use Formula for display-only derived values; use Python computed fields for everything else.

Will my custom fields survive an Odoo upgrade? +

Yes. Custom fields stored as ir.model.fields records are preserved during Odoo upgrades because they are treated as data, not code. The underlying database columns persist as well. However, always test on a staging database before upgrading production.