Наповнення бази даних

odoo-bin populate
10 серпня 2023 р. від
Олена Кирилюк

Замість виснажливого ручного або програмного наповнення тестових даних можна використовувати цю функцію для заповнення бази даних за запитом бажаною кількістю тестових даних. Це можна використовувати для виявлення різних помилок або проблем із продуктивністю в тестованих потоках.

Детальніше: https://www.odoo.com/documentation/15.0/uk/developer/reference/backend/testing.html#database-population

У каталозі модуля потрібно створити каталог populate і в ньому створити файли https://__init__.py/ і файли, що описують правила наповнення бази, окремий файл для кожної моделі. Усі ці файли мають бути вказані у файлі __init__.py. А у файлі https://__init__.py/ головного каталогу модуля потрібно додати "from . import populate".

Властивості:


  • Model._populate_sizes 

  • Model._populate_dependencies 

Методи:


  • Model._populate(size)

  • Model._populate_factories()

Інструменти для наповнення

  • odoo.tools.populate.cartesian(vals, weights=None, seed=False, formatter=<function format_str>, then=None)

  • odoo.tools.populate.compute(function, seed=None)

  • odoo.tools.populate.constant(val, formatter=<function format_str>)

  • odoo.tools.populate.iterate(vals, weights=None, seed=False, formatter=<function format_str>, then=None)

  • odoo.tools.populate.randint(a, b, seed=None)
  • odoo.tools.populate.randomize(vals, weights=None, seed=False, formatter=<function format_str>, counter_offset=0)

Приклад команди запуску наповнення бази даних для Windows:


D:\Projects\Odoo\venv\Scripts\python.exe D:/Projects/Odoo/odoo-bin populate --models=estate.property.tag --size=small -d odoo

Приклад опису:

from odoo.tools import populate
class CustomModel(models.Model)
_inherit = "custom.some_model"
_populate_sizes = {"small": 100, "medium": 2000, "large": 10000}
_populate_dependencies = ["custom.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["custom.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

Читати далі
Bootstrap 4