Посібник з мапування полів
Мапування полів є основою синхронізації 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
}