Посібник з мапування полів
Мапування полів є основою синхронізації API, визначаючи, як дані переходять між Odoo та зовнішніми системами. Цей посібник надає детальні інструкції для ефективного налаштування мапувань.
Огляд
Мапування полів визначає взаємозв'язок між:
- Полями Odoo — технічні назви полів у ваших моделях (наприклад,
res.partner.name
) - Параметрами API — ключі у запитах та відповідях зовнішніх сервісів (наприклад,
customer_name
) - Трансформаціями — обробкою даних під час синхронізації
Базове мапування полів
Просте один-до-одного мапування
Найпоширеніший сценарій — пряме зіставлення полів:
# Поле Odoo → Поле API
partner.name → customer_name
partner.email → contact_email
partner.phone → phone_number
Кроки конфігурації
-
Перехід до мапування полів
- Перейдіть до Налаштування → Технічні → Конфігурації API синхронізації
- Виберіть вашу конфігурацію
- Натисніть на вкладку Мапування полів
-
Додавання нового мапування
Поле Odoo: name
Поле API: customer_name
Напрямок: Обидва (Вхідний і Вихідний)
Обов'язкове: Так -
Збереження та тестування
- Збережіть конфігурацію
- Перевірте синхронізацію на те стових даних
- Переконайтеся в коректності логів
Розширені типи полів
Наш конектор підтримує реляційне мапування полів безпосередньо з інтерфейсу конфігурації.
Це прибирає потребу у власних Python-скриптах — достатньо обрати на формі конфігурації значення Value Calculation Type → Relational with Mapping Model та вказати відповідну модель мапування.
Many2one поля
Для зв'язків «багато-до-одного» (наприклад, field_id
у моделі):
Приклад: Продукт → Одиниця виміру
Конфігурація створення продукту
Field | Value Calculation Type | External API Key | Mapping Model | Is Record Identifier |
---|---|---|---|---|
Unit of Measure (Product) | Relational with Mapping Model | uom_id | uom | False |
Конфігурація одиниць виміру
Field | Value Calculation Type | External API Key | Is Record Identifier |
---|---|---|---|
Display Name (Product Unit of Measure) | Plain | name | False |
ID (Product Unit of Measure) | Plain | id | True |
💡 Під час створення продукту через API система автоматично зіставить uom_id
з відповідним записом uom.uom
у Odoo.
One2many поля
Для дочірніх записів (наприклад, рядки замовлення) налаштовується окрема модель мапування.
Конфігурація замовлення
Field | Value Calculation Type | External API Key | Mapping Model |
---|---|---|---|
Order Lines | Relational with Mapping Model | items | order_line |
Конфігурація рядка замовлення
Field | Value Calculation Type | External API Key | Mapping Model |
---|---|---|---|
Product | Relational with Mapping Model | sku | product |
Quantity | Plain | qty | — |
Unit Price | Plain | price | — |
Конектор автоматично генерує кортежі (0, 0, {...})
для кожного дочірнього запису.
Many2many поля
Для зв'язків «багато-до-багатьох» (наприклад, теги) використовуйте модель мапування, що перетворює зовнішні значення в ID Odoo.
Конфігурація продукту
Field | Value Calculation Type | External API Key | Mapping Model |
---|---|---|---|
Tags | Relational with Mapping Model | tags | product_tag |
Конфігурація тегів
Field | Value Calculation Type | External API Key | Is Record Identifier |
---|---|---|---|
Tag Name | Plain | name | True |
External ID | Plain | id | False |
Конектор автоматично формує список (6, 0, ids)
для Many2many-полів.
Чому цей підхід працює
- UI-first: Усі мапування налаштовуються з інтерфейсу конфігурації без коду
- Повторне використання: Моделі мапування (наприклад,
uom
,order_line
,product_tag
) можна прив'язувати до різних конфігурацій - Послідовність: Єдина схема працює для
Many2one
,One2many
таMany2many
- Розширюваність: За потреби розробники можуть додати додаткову логіку у моделі мапування
Трансформація даних
Використання Python-скриптів
Виконуйте обробку даних під час синхронізації:
def transform_inbound(data):
"""Transform incoming API data to Odoo format"""
# Format phone number
phone = data.get('phone', '')
if phone and not phone.startswith('+'):
phone = '+1' + phone.replace('-', '')
# Parse address
address_parts = data.get('address', '').split(',')
return {
'name': data.get('customer_name'),
'phone': phone,
'street': address_parts[0] if address_parts else '',
'city': address_parts[1].strip() if len(address_parts) > 1 else '',
'email': data.get('email', '').lower(),
'customer_rank': 1
}