Automatically translate Odoo models into Datamodels for (de)serialization
Project description
This module takes advantage of the concepts introduced in the datamodel module to offer mechanisms similar to (a subset of) the ModelSerializer in Django REST Framework. That is, use the definition of the Odoo model to partially automate the definition of a corresponding Datamodel class.
Table of contents
Usage
ModelSerializer
class
The ModelSerializer
class inherits from the Datamodel
class and adds functionalities. Therefore any
class inheriting from ModelSerializer
can be used the exact same way as any other Datamodel
.
Basic usage
Here is a basic example:
from odoo.addons.model_serializer.core import ModelSerializer class PartnerInfo(ModelSerializer): _name = "partner.info" _model = "res.partner" _model_fields = ["id", "name", "country_id"]
The result is equivalent to the following Datamodel
classes:
from marshmallow import fields from odoo.addons.datamodel.core import Datamodel from odoo.addons.datamodel.fields import NestedModel class PartnerInfo(Datamodel): _name = "partner.info" id = fields.Integer(required=True, allow_none=False, dump_only=True) name = fields.String(required=True, allow_none=False) country = NestedModel("_auto_nested_serializer.res.country") class _AutoNestedSerializerResCountry(Datamodel): _name = "_auto_nested_serializer.res.country" id = fields.Integer(required=True, allow_none=False, dump_only=True) display_name = fields.String(dump_only=True)
Overriding fields definition
It is possible to override the default definition of fields as such:
from odoo.addons.model_serializer.core import ModelSerializer class PartnerInfo(ModelSerializer): _name = "partner.info" _model = "res.partner" _model_fields = ["id", "name", "country_id"] country_id = NestedModel("country.info") class CountryInfo(ModelSerializer): _name = "country.info" _model = "res.country" _model_fields = ["code", "name"]
In this example, we override a NestedModel
but it works the same for any other field type.
(De)serialization
ModelSerializer
does all the heavy-lifting of transforming a Datamodel
instance into the corresponding
recordset
, and vice-versa.
To transform a recordset into a (list of) ModelSerializer
instance(s) (serialization), do the following:
partner_info = self.env.datamodels["partner.info"].from_recordset(partner)
This will return a single instance; if your recordset contains more than one record, you can get a list of instances
by passing many=True
to this method.
To transform a ModelSerializer
instance into a recordset (de-serialization), do the following:
partner = partner_info.to_recordset()
Unless an existing partner can be found (see below), this method creates a new record in the database. You can avoid
that by passing create=False
, in which case the system will only create them in memory (NewId
recordset).
In order to determine if the corresponding Odoo record already exists or if a new one should be created, the system
checks by default if the id
field of the instance corresponds to a database record. This default behavior can be
modified like so:
class CountryInfo(ModelSerializer): _name = "country.info" _model = "res.country" _model_fields = ["code", "name"] def get_odoo_record(self): if self.code: return self.env[self._model].search([("code", "=", self.code)]) return super().get_odoo_record()
Changelog
14.0.1.0.0
First official version.
15.0.1.0.0
Second version.
Bug Tracker
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed feedback.
Do not contact contributors directly about support or help with technical issues.
Credits
Contributors
François Degrave <f.degrave@wakari.be>
Maintainers
This module is maintained by the OCA.
OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.
Current maintainer:
This module is part of the OCA/rest-framework project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for odoo_addon_model_serializer-15.0.1.2.0.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 43d25212bf0845fda2eeaded392e4be7381d06cc21ce31831f2b06129d50616f |
|
MD5 | 3b4e796fc3a956d8e4d04226134c25e0 |
|
BLAKE2b-256 | 23694674deddfa2400a5ef8df4e3fe163c2aba9ce7a23bf004ee90b332356a76 |