Odoo 19.0 Community · Persistent

project.project: fields, relations and API

The project.project model ("Project") is a persistent model declared by the Project module, then extended by 13 other modules. It exposes 129 fields, 84 of them declared directly on the model; 26 fields from other models point to it. Below you will find every field with its technical name, type, label and relations, followed by an Odoo 19 JSON-2 API call.

Model identity

Technical name
project.project
Label
Project
Type
Persistent (models.Model)
SQL table
project_project
Origin module
Project (project)
Extended by
hr_timesheet, project_account, project_hr_expense, project_mrp, project_mrp_account, sale_project, project_purchase, project_stock, project_sale_expense, project_sms, project_stock_account, sale_project_stock, sale_timesheet
Default order (_order)
sequence, name, id
Inherits from (mixins)
portal.mixinmail.alias.mixinrating.parent.mixinmail.activity.mixinmail.tracking.duration.mixinanalytic.plan.fields.mixin

Model fields

84 own fields, 39 inherited from mixins and 6 automatic ORM fields. Click a name to get a direct link to that field.

129 of 129 fields shown

Technical nameLabelTypeDetails
access_instruction_messageAccess Instruction Messagechar
computed
account_idAccountmany2one
activeActiveboolean
alias_idAlias

Internal email associated with this project. Incoming emails are automatically synchronized with Tasks (or optionally Issues if the Issue Tracker module is installed).

many2one
allocated_hoursAllocated Timefloat

added by Task Logs (hr_timesheet)

allow_billableBillableboolean

added by Sales - Project (sale_project)

allow_milestonesMilestonesboolean
allow_recurring_tasksRecurring Tasksboolean
allow_task_dependenciesTask Dependenciesboolean
allow_timesheetsTimesheetsboolean
computed, stored

added by Task Logs (hr_timesheet)

analytic_account_activeActive Accountboolean

related: account_id.active

added by Task Logs (hr_timesheet)

analytic_account_balanceAnalytic Account Balancemonetary

related: account_id.balance

billing_typeBilling Typeselection
requiredcomputed, stored

Values: not_billable (not billable), manually (billed manually)

added by Sales Timesheet (sale_timesheet)

bom_countBom Countinteger
computed

added by MRP Project (project_mrp)

can_mark_milestone_as_doneCan Mark Milestone As Doneboolean
computed
closed_task_countClosed Task Countinteger
computed
collaborator_count# Collaboratorsinteger
computed
collaborator_idsCollaboratorsone2many

inverse: project_id

colorColor Indexinteger
company_idCompanymany2one
computed, stored
currency_idCurrencymany2one
read-onlycomputed
dateExpiration Date

Date on which this project ends. The timeframe defined on the project is taken into account when viewing its planning.

date
date_startStart Datedate
descriptionDescription

Description to provide more information and context about this project

html
display_sales_stat_buttonsDisplay Sales Stat Buttonsboolean
computed

added by Sales - Project (sale_project)

duration_trackingDuration Trackingjson
effective_hoursTime Spentfloat
computed

added by Task Logs (hr_timesheet)

encode_uom_in_daysEncode Uom In Daysboolean
computed

added by Task Logs (hr_timesheet)

favorite_user_idsMembersmany2many
has_any_so_to_invoiceHas SO to Invoiceboolean
computed

added by Sales - Project (sale_project)

has_any_so_with_nothing_to_invoiceHas a SO with an invoice status of Noboolean
computed

added by Sales - Project (sale_project)

invoice_countInvoice Countinteger
computed

added by Sales - Project (sale_project)

is_favoriteShow Project on Dashboardboolean
computed
is_internal_projectIs Internal Projectboolean
computed

added by Task Logs (hr_timesheet)

is_milestone_deadline_exceededIs Milestone Deadline Exceededboolean
computed
is_milestone_exceededIs Milestone Exceededboolean
computed
is_project_overtimeProject in Overtimeboolean
computed

added by Task Logs (hr_timesheet)

is_templateIs Templateboolean
label_tasksUse Tasks as

Name used to refer to the tasks of your project e.g. tasks, tickets, sprints, etc...

char
translatable
last_update_colorLast Update Colorinteger
computed
last_update_idLast Updatemany2one
last_update_statusLast Update Statusselection
requiredcomputed, stored

Values: on_track (On Track), at_risk (At Risk), off_track (Off Track), on_hold (On Hold), to_define (Set Status), done (Complete)

milestone_countMilestone Countinteger
computed
milestone_count_reachedMilestone Count Reachedinteger
computed
milestone_idsMilestoneone2many

inverse: project_id

milestone_progressMilestones Reachedinteger
computed
nameNamechar
requiredtranslatable
next_milestone_idNext Milestonemany2one
computed
open_task_countOpen Task Countinteger
computed
partner_idCustomermany2one
computed, stored
pricing_typePricing

The task rate is perfect if you would like to bill different services to different customers at different rates. The fixed rate is perfect if you bill a service at a fixed rate per hour or day worked regardless of the employee who performed it. The employee rate is preferable if your employees deliver the same service at a different rate. For instance, junior and senior consultants would deliver the same service (= consultancy), but at a different rate because of their level of seniority.

selection
computed

Values: task_rate (Task rate), fixed_rate (Project rate), employee_rate (Employee rate)

added by Sales Timesheet (sale_timesheet)

privacy_visibilityVisibility

Project and Task Visibility: - Invited internal users: Can access only the project or tasks they follow. Assignees automatically get access. - Invited internal and portal users: Same as above, extended to portal users. - All internal users: Full access to the project and all its tasks. - All internal and invited portal users: Internal users get full access. Portal users can access only the project or tasks they follow. Portal Access Levels: - Read-only: Portal users see tasks via their portal but can’t edit them. - Edit (limited): Portal users access kanban/list views and can edit limited fields on followed tasks. - Edit: Same as above, with access to all tasks. Other Rules: - Internal users can open a task from a direct link, even without project access. - Project admins have access to private projects, even if not followers.

selection
required

Values: followers (Invited internal users), invited_users (Invited internal and portal users), employees (All internal users), portal (All internal users and invited portal users)

privacy_visibility_warningPrivacy Visibility Warningchar
computed
production_countProduction Countinteger
computed

added by MRP Project (project_mrp)

purchase_orders_count# Purchase Ordersinteger
computed

added by Project Purchase (project_purchase)

reinvoiced_sale_order_idSales Order

Products added to stock pickings, whose operation type is configured to generate analytic costs, will be re-invoiced in this sales order if they are set up for it.

many2one

added by Sales - Project (sale_project)

remaining_hoursTime Remainingfloat
computed

added by Task Logs (hr_timesheet)

resource_calendar_idWorking Timemany2one
computed
sale_line_employee_idsSale line/Employee map

Sales order item that will be selected by default on the timesheets of the corresponding employee. It bypasses the sales order item defined on the project and the task, and can be modified on each timesheet entry if necessary. In other words, it defines the rate at which an employee's time is billed based on their expertise, skills or experience, for instance. If you would like to bill the same service at a different rate, you need to create two separate sales order items as each sales order item can only have a single unit price at a time. You can also define the hourly company cost of your employees for their timesheets on this project specifically. It will bypass the timesheet cost set on the employee.

one2many

inverse: project_id

added by Sales Timesheet (sale_timesheet)

sale_line_idSales Order Item

Sales order item that will be selected by default on the tasks and timesheets of this project, except if the employee set on the timesheets is explicitely linked to another sales order item on the project. It can be modified on each task and timesheet entry individually if necessary.

many2one
computed, stored

added by Sales - Project (sale_project)

sale_order_countSale Order Countinteger
computed

added by Sales - Project (sale_project)

sale_order_idSale Ordermany2one

related: sale_line_id.order_id

added by Sales - Project (sale_project)

sale_order_line_countSale Order Line Countinteger
computed

added by Sales - Project (sale_project)

sale_order_stateSale Order Stateselection

related: sale_order_id.state

added by Sales - Project (sale_project)

sequenceSequenceinteger
show_ratingsShow Ratingsboolean
computed
stage_idStagemany2one
stage_id_colorStage Colorinteger

related: stage_id.color

tag_idsTagsmany2many
task_completion_percentageTask Completion Percentagefloat
computed
task_countTask Countinteger
computed
task_idsTasksone2many

inverse: project_id

task_properties_definitionTask Propertiesproperties_definition
tasksTask Activitiesone2many

inverse: project_id

timesheet_encode_uom_idTimesheet Encode Uommany2one
computed

added by Task Logs (hr_timesheet)

timesheet_idsAssociated Timesheetsone2many

inverse: project_id

added by Task Logs (hr_timesheet)

timesheet_product_idTimesheet Product

Service that will be used by default when invoicing the time spent on a task. It can be modified on each task individually by selecting a specific sales order item.

many2one
computed, stored

added by Sales Timesheet (sale_timesheet)

total_timesheet_timeTotal amount of time (in the proper unit) recorded in the project, rounded to the unit.float
computed

added by Task Logs (hr_timesheet)

type_idsTasks Stagesmany2many
update_countUpdate Countinteger
computed
update_idsUpdateone2many

inverse: project_id

user_idProject Managermany2one
vendor_bill_countVendor Bill Countinteger

related: account_id.vendor_bill_count

added by Sales - Project (sale_project)

warning_employee_rateWarning Employee Rateboolean
computed

added by Sales Timesheet (sale_timesheet)

access_tokenSecurity Tokenchar

inherited from portal.mixin

access_urlPortal Access URL

Customer Portal URL

char
computed

inherited from portal.mixin

access_warningAccess warningtext
computed

inherited from portal.mixin

activity_calendar_event_idNext Activity Calendar Eventmany2one
computed

inherited from mail.activity.mixin

activity_date_deadlineNext Activity Deadlinedate
read-onlycomputed

inherited from mail.activity.mixin

activity_exception_decorationActivity Exception Decoration

Type of the exception activity on record.

selection
computed

Values: warning (Alert), danger (Error)

inherited from mail.activity.mixin

activity_exception_iconIcon

Icon to indicate an exception activity.

char
computed

inherited from mail.activity.mixin

activity_idsActivitiesone2many

inverse: res_id

inherited from mail.activity.mixin

activity_stateActivity State

Status based on activities Overdue: Due date is already passed Today: Activity date is today Planned: Future activities.

selection
computed

Values: overdue (Overdue), today (Today), planned (Planned)

inherited from mail.activity.mixin

activity_summaryNext Activity Summarychar

related: activity_ids.summary

inherited from mail.activity.mixin

activity_type_iconActivity Type Iconchar

related: activity_ids.icon

inherited from mail.activity.mixin

activity_type_idNext Activity Typemany2one

related: activity_ids.activity_type_id

inherited from mail.activity.mixin

activity_user_idResponsible Usermany2one
read-onlycomputed

inherited from mail.activity.mixin

alias_defaultsAlias Defaultstext

inherited from mail.alias.mixin

alias_domainAlias Domain Namechar

related: alias_id.alias_domain

inherited from mail.alias.mixin.optional

alias_domain_idAlias Domainmany2one

related: alias_id.alias_domain_id

inherited from mail.alias.mixin.optional

alias_emailEmail Aliaschar
computed

inherited from mail.alias.mixin.optional

alias_nameAlias Namechar

inherited from mail.alias.mixin

auto_account_idAnalytic Accountmany2one
computed

inherited from analytic.plan.fields.mixin

has_messageHas Messageboolean
computed

inherited from mail.thread

is_rottingRottingboolean
computed

inherited from mail.tracking.duration.mixin

message_attachment_countAttachment Countinteger
computed

inherited from mail.thread

message_follower_idsFollowersone2many

inverse: res_id

inherited from mail.thread

message_has_errorMessage Delivery error

If checked, some messages have a delivery error.

boolean
computed

inherited from mail.thread

message_has_error_counterNumber of errors

Number of messages with delivery error

integer
computed

inherited from mail.thread

message_has_sms_errorSMS Delivery error

If checked, some messages have a delivery error.

boolean
computed

inherited from mail.thread

message_idsMessagesone2many

inverse: res_id

inherited from mail.thread

message_is_followerIs Followerboolean
computed

inherited from mail.thread

message_needactionAction Needed

If checked, new messages require your attention.

boolean
computed

inherited from mail.thread

message_needaction_counterNumber of Actions

Number of messages requiring action

integer
computed

inherited from mail.thread

message_partner_idsFollowers (Partners)many2many
computed

inherited from mail.thread

my_activity_date_deadlineMy Activity Deadlinedate
read-onlycomputed

inherited from mail.activity.mixin

rating_avgAverage Ratingfloat
computed

inherited from rating.parent.mixin

rating_avg_percentageAverage Rating (%)float
computed

inherited from rating.parent.mixin

rating_count# Ratingsinteger
computed

inherited from rating.parent.mixin

rating_idsRatingsone2many

inverse: parent_res_id

inherited from rating.parent.mixin

rating_percentage_satisfactionRating Satisfaction

Percentage of happy ratings

integer
computed

inherited from rating.parent.mixin

rotting_daysDays Rotting

Day count since this resource was last updated

integer
computed

inherited from mail.tracking.duration.mixin

website_message_idsWebsite Messages

Website communication history

one2many

inverse: res_id

inherited from mail.thread

create_dateCreated ondatetime
read-onlyautomatic
create_uidCreated bymany2one
read-onlyautomatic
display_nameDisplay Namechar
read-onlycomputedautomatic
idIDinteger
read-onlyautomatic
write_dateLast Updated ondatetime
read-onlyautomatic
write_uidLast Updated bymany2one
read-onlyautomatic

Relations

Models linked from this model

Fields of other models pointing here

Reading this model through the API

Odoo 19 JSON-2 API call reading the first five records with real fields of the model. Replace the instance, database and API key with your own.

curl
curl -X POST "https://your-instance.odoo.com/json/2/project.project/search_read" \
  -H "Authorization: bearer $ODOO_API_KEY" \
  -H "X-Odoo-Database: your-db" \
  -H "Content-Type: application/json" \
  -d '{"domain":[],"fields":["name","billing_type","last_update_status","privacy_visibility","account_id"],"limit":5}'
Python (requests)
import requests

BASE_URL = "https://your-instance.odoo.com/json/2"
headers = {"Authorization": f"bearer {API_KEY}", "X-Odoo-Database": "your-db"}

res = requests.post(
    f"{BASE_URL}/project.project/search_read",
    headers=headers,
    json={"domain": [], "fields": ["name","billing_type","last_update_status","privacy_visibility","account_id"], "limit": 5},
)
res.raise_for_status()
print(res.json())
  • External API access requires Odoo's Custom plan.
  • XML-RPC and JSON-RPC will be removed in Odoo 22 (fall 2028): use JSON-2.
  • The access rights and record rules of the key's user apply.

Cite this tool

Writing a tutorial, internal documentation or a forum answer? Copy this link to send your readers to the up-to-date reference.

<a href="https://aidoo.ai/en/outils/explorateur-modeles-odoo/project-project">project.project (Odoo 19.0)</a>

Sources

Data verified on September 23, 2026 · Odoo 19.0 Community

Have an Odoo project, or want to put your ERP to work with AI? Let's talk

Implementation, custom module development, connecting Claude or ChatGPT to your data: tell us about your context and we will reply within 24 business hours.