# Model service | Technical name | Dependencies | | -------------- | ------------- | | `model` | `rpc`, `user` | ## Overview The `model` service is the standard way to interact with a python model, on the server. Obviously, each such interaction is asynchronous (and will be done by using the `rpc` service). In short, the `model` service provides a simple API to call the most common orm methods, such as `read`, `search_read`, `write` ... It also has a generic `call` method to call an arbitrary method from the model. Another interesting point to mention is that the user context will automatically be added to each model request. Here is a short example of a few possible ways to interact with the `model` service: ```ts class MyComponent extends Component { model = useService("model"); async someMethod() { // return all fields from res.partner 3 const result = await this.model("res.partner").read([3]); // create a some.model record with a field name set to 'some name' and a // color key set in the context const id = await this.model("some.model").create({ name: "some name" }, { color: "red" }); // perform a read group with some parameters const groups = await this.model("sale.order").readGroup( [["user_id", "=", 2]], ["amount_total:sum"], ["date_order"] ); } } ``` Because the `model` service is a higher level service than `rpc`, easier to use, and with some additional features, it should be preferred above `rpc`. ## API The `model` service exports a single function with the following signature: ```ts function model(modelName: string): Model { ... } ``` A `Model` is here defined as an object linked to the `modelName` odoo model (for example `res.partner` or `sale.order`) with the following five functions, each of them bound to `modelName`: - `create(state: object, ctx?: Context): Promise`: call the `create` method for the `modelName` model defined above, - `read(ids: number[], fields: string[], ctx?: Context): Promise`: read one or more records - `readGroup(domain: any[], fields: string[], groupby: string[], options?: GroupByOptions, ctx?: Context): Promise;` - `searchRead(domain: Domain, fields: string[], options?: SearchReadOptions, ctx?: Context): Promise;` - `unlink(ids: number[], ctx?: Context): Promise` - `write(ids: number[], data: object, context?: Context): Promise` - `call(method: string, args?: any[], kwargs?: KWargs): Promise` ## Additional notes - since it uses the `rpc` service, it provides the same optimization when used by a component: an error will be thrown if a destroyed component attempts to initiate a model call, and requests will be left pending if a component is destroyed in the meantime.