
Odoo CLI supports Database Population.
This article gives an overview of how we can work with the Database Population in Odoo as a developer.
Before starting this tutorial, you should have a basic idea of CLI in Odoo. Besides, If you don’t have basic knowledge of Odoo CLI, read a beginner guide to Odoo CLI.
Why do we need a Database Population in Odoo CLI?
You can test your modules in the database by automatic data generation of the model’s records
Before moving ahead, check out our Odoo development services & an extensive range of quality Odoo Apps.
How does Database Population work in Odoo CLI?
Syntax:-
odoo-bin populate –-models product.category,product.template –-size small -d demo –-db_user odoo --db_password=webkul
Output for upper command


Parameters:-
– -models
list of models for which the database should be filled.
– -size(small | medium | large)
The total number of the records to be created is depends on the model’s populate_size attribute
The generated records content is specified by the _populate_factories() method of a given model.
-d
Name of the db
–db_user
Name of the DB User
–db_password
Password for the DB User
Implement Features on a Given Model
Define the following methods and attributes to populate a given model:-
i) Model._populate_sizes
The default population sizes are:
Small: 10
Medium: 100
Large: 1000
populate sizes are the number of records that _populate() should create.
ii) Model._populate_dependencies
Return the list of models which have to be populated before the current one.
iii) Model._populate(size)
Create records to populate this model.
iv) Model._populate_factories()
Generates a factory for the different fields of the model.
factory is a generator of values (dict of field values).
Factory skeleton:
def generator(iterator, field_name, model_name):
for counter, values in enumerate(iterator):
# values.update(dict())
yield values
Note*: You have to define at least _populate() or _populate_factories() on the model to enable database population.
Example:
from odoo.tools import populate
class WebkulModel(models.Model)
_inherit = "webkul.some_model"
_populate_sizes = {"small": 100, "medium": 2000, "large": 10000}
_populate_dependencies = ["webkul.some_other_model"]
def _populate_factories(self):
# Record ids of previously populated models are accessible in the registry
some_other_ids = self.env.registry.populated_models["webkul.some_other_model"]
def get_some_field(values=None, random=None, **kwargs):
""" Choose a value for some_field depending on other fields values.
:param dict values:
:param random: seeded :class:`random.Random` object
"""
field_1 = values['field_1']
if field_1 in [value2, value3]:
return random.choice(some_field_values)
return False
return [
("field_1", populate.randomize([value1, value2, value3])),
("field_2", populate.randomize([value_a, value_b], [0.5, 0.5])),
("some_other_id", populate.randomize(some_other_ids)),
("some_field", populate.compute(get_some_field, seed="some_field")),
('active', populate.cartesian([True, False])),
]
def _populate(self, size):
records = super()._populate(size)
# If you want to update the generated records
# E.g setting the parent-child relationships
records.do_something()
return records
Population Tools
Multiple population tools are available to easily create the needed data generators.
i) odoo.tools.populate.cartesian(vals, weights=None, seed=False, formatter=<function format_str>, then=None)
Return a factory for an iterator of values dicts that combines all vals for the field with the other field values in input.
Parameters:
- vals (list) – list in which a value will be chosen, depending on
weights - weights (list) – list of probabilistic weights
- seed – optional initialization of the random number generator
- formatter (function) – (val, counter, values) –> formatted_value
- then (function) – if defined, factory used when vals has been consumed.
Returns: function of the form (iterator, field_name, model_name) -> values
Return type: function (iterator, str, str) -> dict
ii) odoo.tools.populate.compute(function, seed=None)
Return a factory for an iterator of values dictionary (dicts) that computes the field value as a function (values, counter, random), where values are the other field value, counter is an integer, and random is a pseudo-random number generator.
Parameters:
- function (callable) – (values, counter, random) –> field_values
- seed – optional initialization of the random number generator
Returns: function of the form (iterator, field_name, model_name) -> values
Return type: function (iterator, str, str) -> dict
iii) odoo.tools.populate.constant(val, formatter=<function format_str>)
Return a factory for an iterator of values dicts that sets the field to the given value in each input dict.
Returns: function of the form (iterator, field_name, model_name) -> values
Return type: function (iterator, str, str) -> dict
iv) odoo.tools.populate.iterate(vals, weights=None, seed=False, formatter=<function format_str>, then=None).
Return a factory for an iterator of values dicts that picks a value among vals for each input. Once all vals have been used once, resume as then or as a randomize generator.
Parameters:
- vals (list) – list in which a value will be chosen, depending on
weights - weights (list) – list of probabilistic weights
- seed – optional initialization of the random number generator
- formatter (function) – (val, counter, values) –> formatted_value
- then (function) – if defined, factory used when vals has been consumed.
Returns: function of the form (iterator, field_name, model_name) -> values
Return type: function (iterator, str, str) -> dict
v) odoo.tools.populate.randint(a, b, seed=None)
Return a factory for an iterator of values dicts that sets the field to a random integer between a and b included in each input dict.
Parameters:
- a (int) – minimal random value
- b (int) – maximal random value
- seed (int) –
Returns: function of the form (iterator, field_name, model_name) -> values
Return type: function (iterator, str, str) -> dict
vi) odoo.tools.populate.randomize(vals, weights=None, seed=False, formatter=<function format_str>, counter_offset=0)
Return a factory for an iterator of values dicts with pseudo-randomly chosen values (among vals) for a field.
Parameters:
- vals (list) – list in which a value will be chosen, depending on
weights - weights (list) – list of probabilistic weights
- seed – optional initialization of the random number generator
- formatter (function) – (val, counter, values) –> formatted_value
- counter_offset (int) –
Returns: function of the form (iterator, field_name, model_name) -> values
Return type: function (iterator, str, str) -> dict
NEED HELP?
Hope you find the guide helpful! Please feel free to share your feedback in the comments below.
If you still have any issues/queries regarding the same, please raise a ticket at the UV Desk.
For any doubt, contact us at our support mail.

Be the first to comment.