Odoo REST API: عملی مثالیں اور انٹیگریشن ٹیوٹوریل
پوسٹ مین کی 2025 اسٹیٹ آف APIs کی رپورٹ کے مطابق، 73% کاروبار اب اپنے ERP کو کم از کم تین بیرونی نظاموں کے ساتھ مربوط کرتے ہیں۔ Odoo، دنیا بھر میں 12 ملین سے زیادہ صارفین کو طاقت دیتا ہے، ایک بھرپور API پرت کے ذریعے اپنے پورے ڈیٹا ماڈل کو بے نقاب کرتا ہے۔ اس کے باوجود دستاویزات بہت سے ڈویلپرز کو تصدیق کے بہاؤ، بیچ آپریشنز، اور پروڈکشن گریڈ کی خرابی سے نمٹنے کے ساتھ جدوجہد کر رہی ہیں۔
یہ ٹیوٹوریل ہر عام انضمام کے پیٹرن کے لیے Python اور Node.js دونوں میں کاپی پیسٹ کے لیے تیار مثالیں فراہم کرتا ہے۔ چاہے آپ Shopify آرڈرز کی مطابقت پذیری کر رہے ہوں، موبائل ایپ سے ڈیٹا کو آگے بڑھا رہے ہوں، یا حسب ضرورت ڈیش بورڈ بنا رہے ہوں، اس گائیڈ نے آپ کا احاطہ کیا ہے۔
اہم نکات
- Odoo API تک رسائی کے تین طریقے پیش کرتا ہے: XML-RPC (وراثت، تمام ورژنز)، JSON-RPC (ویب کلائنٹ پروٹوکول)، اور REST API (Odoo 17+ API کیز کے ساتھ) — ہر ایک مختلف تصدیق اور استعمال کے معاملات کے ساتھ۔
- API کلیدی تصدیق (Odoo 17+) سرور سے سرور کے انضمام کے لیے تجویز کردہ طریقہ ہے — کوئی سیشن مینجمنٹ نہیں، کوئی CSRF ٹوکن نہیں، سیدھے HTTP ہیڈر۔
- ڈومین تلاش کریں فلٹرنگ کے لیے Odoo کے طاقتور پولش اشارے کا استعمال کریں — آپریٹرز میں مہارت حاصل کریں اور آپ کسی بھی ڈیٹا کے امتزاج سے استفسار کر سکتے ہیں۔
- بیچ آپریشن کارکردگی کے لیے اہم ہیں — ایک API کال کے ساتھ 1,000 ریکارڈ بنانا 1,000 انفرادی کالوں سے 50 گنا زیادہ تیز ہے۔
- خرابی سے نمٹنے اور شرح کو محدود کرنا پروڈکشن انضمام کے لیے ضروری ہیں — Odoo سٹرکچرڈ غلطی کے جوابات دیتا ہے جسے آپ کے کوڈ کو پارس کرنا چاہیے اور احسن طریقے سے ہینڈل کرنا چاہیے۔
1. تصدیق کے طریقے
طریقہ 1: API کیز (Odoo 17+ کے لیے تجویز کردہ)
API کیز سرور سے سرور مواصلات کے لیے سب سے آسان اور محفوظ ترین طریقہ ہیں:
# Generate an API key in Odoo:
# Settings → Users → Select user → Account Security → New API Key
# Test authentication
curl -X GET "https://your-odoo.com/api/res.partner" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"
** API کلید کے ساتھ ازگر:**
import requests
class OdooAPI:
def __init__(self, url, api_key):
self.url = url.rstrip('/')
self.session = requests.Session()
self.session.headers.update({
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json',
})
def get(self, model, params=None):
response = self.session.get(
f'{self.url}/api/{model}',
params=params or {}
)
response.raise_for_status()
return response.json()
def post(self, model, data):
response = self.session.post(
f'{self.url}/api/{model}',
json=data
)
response.raise_for_status()
return response.json()
# Usage
odoo = OdooAPI('https://your-odoo.com', 'your-api-key-here')
partners = odoo.get('res.partner', {'limit': 10})
API کلید کے ساتھ Node.js:
const axios = require('axios');
class OdooAPI {
constructor(url, apiKey) {
this.client = axios.create({
baseURL: `${url}/api`,
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json',
},
timeout: 30000,
});
}
async get(model, params = {}) {
const { data } = await this.client.get(`/${model}`, { params });
return data;
}
async post(model, body) {
const { data } = await this.client.post(`/${model}`, body);
return data;
}
async put(model, id, body) {
const { data } = await this.client.put(`/${model}/${id}`, body);
return data;
}
async delete(model, id) {
const { data } = await this.client.delete(`/${model}/${id}`);
return data;
}
}
// Usage
const odoo = new OdooAPI('https://your-odoo.com', 'your-api-key');
const partners = await odoo.get('res.partner', { limit: 10 });
طریقہ 2: JSON-RPC (تمام ورژن)
JSON-RPC وہ پروٹوکول ہے جسے Odoo کے ویب کلائنٹ اندرونی طور پر استعمال کرتے ہیں۔ یہ تمام Odoo ورژن کے ساتھ کام کرتا ہے:
import requests
import json
class OdooJsonRpc:
def __init__(self, url, db, username, password):
self.url = url.rstrip('/')
self.db = db
self.session = requests.Session()
self.uid = self._authenticate(username, password)
def _authenticate(self, username, password):
response = self._call('/web/session/authenticate', {
'db': self.db,
'login': username,
'password': password,
})
if not response.get('uid'):
raise Exception(f"Authentication failed: {response}")
return response['uid']
def _call(self, endpoint, params):
payload = {
'jsonrpc': '2.0',
'method': 'call',
'params': params,
'id': None,
}
response = self.session.post(
f'{self.url}{endpoint}',
json=payload,
headers={'Content-Type': 'application/json'}
)
result = response.json()
if result.get('error'):
raise Exception(result['error']['data']['message'])
return result.get('result')
def search_read(self, model, domain=None, fields=None, limit=80, offset=0, order=None):
return self._call('/web/dataset/call_kw', {
'model': model,
'method': 'search_read',
'args': [domain or []],
'kwargs': {
'fields': fields or [],
'limit': limit,
'offset': offset,
'order': order or '',
},
})
def create(self, model, values):
return self._call('/web/dataset/call_kw', {
'model': model,
'method': 'create',
'args': [values],
'kwargs': {},
})
def write(self, model, ids, values):
return self._call('/web/dataset/call_kw', {
'model': model,
'method': 'write',
'args': [ids, values],
'kwargs': {},
})
# Usage
odoo = OdooJsonRpc('https://your-odoo.com', 'mydb', 'admin', 'password')
orders = odoo.search_read('sale.order', [('state', '=', 'sale')],
fields=['name', 'amount_total', 'partner_id'],
limit=20)
طریقہ 3: XML-RPC (وراثت، یونیورسل)
import xmlrpc.client
url = 'https://your-odoo.com'
db = 'mydb'
username = 'admin'
password = 'password'
# Authenticate
common = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/common')
uid = common.authenticate(db, username, password, {})
# Create models proxy
models = xmlrpc.client.ServerProxy(f'{url}/xmlrpc/2/object')
# Search and read
partners = models.execute_kw(db, uid, password,
'res.partner', 'search_read',
[[('is_company', '=', True), ('country_id.code', '=', 'US')]],
{'fields': ['name', 'email', 'phone'], 'limit': 10}
)
2. CRUD آپریشنز
ریکارڈز بنائیں
# Create a single contact
partner_id = odoo.create('res.partner', {
'name': 'Acme Corporation',
'is_company': True,
'email': '[email protected]',
'phone': '+1-555-0123',
'street': '123 Main Street',
'city': 'San Francisco',
'state_id': 5, # California
'country_id': 233, # United States
'category_id': [(6, 0, [1, 3])], # Tags: replace all with IDs 1 and 3
})
# Create a sale order with lines
order_id = odoo.create('sale.order', {
'partner_id': partner_id,
'date_order': '2026-03-23',
'order_line': [
(0, 0, {
'product_id': 42,
'product_uom_qty': 5,
'price_unit': 99.99,
}),
(0, 0, {
'product_id': 43,
'product_uom_qty': 2,
'price_unit': 149.99,
}),
],
})
Node.js مساوی:
// Create a contact
const partnerId = await odoo.post('res.partner', {
name: 'Acme Corporation',
is_company: true,
email: '[email protected]',
phone: '+1-555-0123',
street: '123 Main Street',
city: 'San Francisco',
country_id: 233,
});
// Create sale order with lines
const orderId = await odoo.post('sale.order', {
partner_id: partnerId,
date_order: '2026-03-23',
order_line: [
[0, 0, { product_id: 42, product_uom_qty: 5, price_unit: 99.99 }],
[0, 0, { product_id: 43, product_uom_qty: 2, price_unit: 149.99 }],
],
});
ریکارڈ پڑھیں
# Read specific fields from specific records
data = odoo.search_read('sale.order',
domain=[('state', '=', 'sale'), ('amount_total', '>', 500)],
fields=['name', 'partner_id', 'amount_total', 'date_order', 'state'],
limit=50,
offset=0,
order='date_order desc'
)
# Read a single record by ID (REST API)
# GET /api/sale.order/42?fields=name,amount_total
// Node.js — read with pagination
async function fetchAllOrders(odoo) {
const pageSize = 100;
let offset = 0;
let allOrders = [];
while (true) {
const orders = await odoo.get('sale.order', {
domain: JSON.stringify([['state', '=', 'sale']]),
fields: 'name,partner_id,amount_total',
limit: pageSize,
offset,
order: 'date_order desc',
});
allOrders = allOrders.concat(orders);
if (orders.length < pageSize) break;
offset += pageSize;
}
return allOrders;
}
ریکارڈز کو اپ ڈیٹ کریں۔
# Update a single record
odoo.write('res.partner', [partner_id], {
'phone': '+1-555-9999',
'website': 'https://acme.com',
})
# Update multiple records at once
draft_orders = odoo.search_read('sale.order',
[('state', '=', 'draft'), ('date_order', '<', '2026-01-01')],
fields=['id']
)
ids = [o['id'] for o in draft_orders]
odoo.write('sale.order', ids, {'note': 'Reviewed Q1 2026'})
ریکارڈز کو حذف کریں۔
# Delete records (use with caution)
odoo.write('res.partner', [obsolete_id], {'active': False}) # Prefer archiving
# Actually delete (rarely needed)
# models.execute_kw(db, uid, password, 'res.partner', 'unlink', [[obsolete_id]])
3. ایڈوانسڈ سرچ ڈومینز
Odoo کے سرچ ڈومین حالات کو یکجا کرنے کے لیے پولش اشارے (سابقہ اشارہ) استعمال کرتے ہیں۔ شرائط کے درمیان ڈیفالٹ آپریٹر AND ہے۔ پائپ کا استعمال کریں '|' OR کے لیے اور ایمپرسینڈ '&' واضح AND کے لیے۔ ہر پتی فیلڈ کے نام، آپریٹر اور قدر کا ایک مجموعہ ہے۔ Odoo متعلقہ ماڈل فیلڈز پر فلٹر کرنے کے لیے ڈاٹ اشارے کو سپورٹ کرتا ہے، جیسے کہ 'partner_id.country_id.code' گاہک کے ملک کے مطابق آرڈرز کو فلٹر کرنے کے لیے۔
# Complex domain examples
# Orders from US customers with amount > $1000, created this year
domain = [
('partner_id.country_id.code', '=', 'US'),
('amount_total', '>', 1000),
('date_order', '>=', '2026-01-01'),
('state', 'in', ['sale', 'done']),
]
# OR condition: email contains 'gmail' OR 'yahoo'
domain = [
'|',
('email', 'ilike', 'gmail.com'),
('email', 'ilike', 'yahoo.com'),
]
# Complex: (state=sale AND amount>1000) OR (state=done AND amount>5000)
domain = [
'|',
'&', ('state', '=', 'sale'), ('amount_total', '>', 1000),
'&', ('state', '=', 'done'), ('amount_total', '>', 5000),
]
# Negation: NOT archived
domain = [('active', '!=', False)]
# NULL check: has no email
domain = [('email', '=', False)]
# Hierarchical: all child categories of 'Electronics'
domain = [('categ_id', 'child_of', electronics_id)]
# Date ranges
from datetime import datetime, timedelta
domain = [
('create_date', '>=', (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d')),
('create_date', '<', datetime.now().strftime('%Y-%m-%d')),
]
آپریٹر حوالہ
| آپریٹر | تفصیل | مثال |
|---|---|---|
= | عین مطابق میچ | ('state', '=', 'sale') |
!= | برابر نہیں | ('state', '!=', 'cancelled') |
>, >=, <, <= | موازنہ | ('amount', '>', 1000) |
in | فہرست میں قیمت | ('state', 'in', ['sale', 'done']) |
not in | قیمت فہرست میں نہیں ہے | ('state', 'not in', ['cancel']) |
like | SQL LIKE (کیس حساس) | ('name', 'like', 'Acme%') |
ilike | کیس غیر حساس LIKE | ('email', 'ilike', '%@gmail.com') |
=like | پیٹرن میچ | ('ref', '=like', 'SO%') |
child_of | درجہ بندی کی اولاد | ('categ_id', 'child_of', 1) |
parent_of | درجہ بندی کے آباؤ اجداد | ('categ_id', 'parent_of', 5) |
4. بیچ آپریشنز
کارکردگی کے لیے بیچ آپریشنز ضروری ہیں۔ کبھی بھی ایک وقت میں ایک لوپ میں ریکارڈ نہ بنائیں:
# BAD: 1000 API calls (slow, ~300 seconds)
for customer in customers:
odoo.create('res.partner', customer)
# GOOD: 1 API call with batch (fast, ~3 seconds)
# Using JSON-RPC batch create
partner_ids = odoo._call('/web/dataset/call_kw', {
'model': 'res.partner',
'method': 'create',
'args': [customers], # Pass list of dicts
'kwargs': {},
})
// Node.js batch pattern with chunking
async function batchCreate(odoo, model, records, chunkSize = 200) {
const results = [];
for (let i = 0; i < records.length; i += chunkSize) {
const chunk = records.slice(i, i + chunkSize);
console.log(`Creating ${model} batch ${i / chunkSize + 1}/${Math.ceil(records.length / chunkSize)}`);
const ids = await odoo.post(model, chunk);
results.push(...(Array.isArray(ids) ? ids : [ids]));
// Respect rate limits
if (i + chunkSize < records.length) {
await new Promise(resolve => setTimeout(resolve, 500));
}
}
return results;
}
// Usage
const customers = generateCustomerData(); // Array of 5000 objects
const ids = await batchCreate(odoo, 'res.partner', customers);
console.log(`Created ${ids.length} partners`);
5. ایرر ہینڈلنگ
پروڈکشن انضمام کو غلطیوں کو احسن طریقے سے ہینڈل کرنا چاہیے:
import requests
import logging
import time
logger = logging.getLogger(__name__)
class OdooAPIClient:
MAX_RETRIES = 3
RETRY_DELAY = 2 # seconds
def __init__(self, url, api_key):
self.url = url.rstrip('/')
self.session = requests.Session()
self.session.headers.update({
'Authorization': f'Bearer {api_key}',
'Content-Type': 'application/json',
})
def _request(self, method, endpoint, **kwargs):
last_error = None
for attempt in range(self.MAX_RETRIES):
try:
response = self.session.request(
method,
f'{self.url}{endpoint}',
timeout=30,
**kwargs
)
if response.status_code == 429:
retry_after = int(response.headers.get('Retry-After', 60))
logger.warning(f"Rate limited. Retrying after {retry_after}s")
time.sleep(retry_after)
continue
if response.status_code == 401:
raise AuthenticationError("Invalid API key or session expired")
if response.status_code == 403:
raise PermissionError(f"Access denied: {response.text}")
if response.status_code == 404:
raise RecordNotFoundError(f"Record not found: {endpoint}")
if response.status_code >= 500:
logger.error(f"Server error {response.status_code}: {response.text}")
if attempt < self.MAX_RETRIES - 1:
time.sleep(self.RETRY_DELAY * (attempt + 1))
continue
raise ServerError(f"Server error after {self.MAX_RETRIES} retries")
response.raise_for_status()
return response.json()
except requests.exceptions.ConnectionError as e:
last_error = e
logger.warning(f"Connection error (attempt {attempt + 1}): {e}")
if attempt < self.MAX_RETRIES - 1:
time.sleep(self.RETRY_DELAY * (attempt + 1))
except requests.exceptions.Timeout as e:
last_error = e
logger.warning(f"Request timeout (attempt {attempt + 1}): {e}")
if attempt < self.MAX_RETRIES - 1:
time.sleep(self.RETRY_DELAY * (attempt + 1))
raise ConnectionError(f"Failed after {self.MAX_RETRIES} attempts: {last_error}")
class AuthenticationError(Exception): pass
class PermissionError(Exception): pass
class RecordNotFoundError(Exception): pass
class ServerError(Exception): pass
// Node.js error handling with axios interceptors
const axios = require('axios');
function createOdooClient(url, apiKey) {
const client = axios.create({
baseURL: `${url}/api`,
headers: { Authorization: `Bearer ${apiKey}` },
timeout: 30000,
});
// Response interceptor for error handling
client.interceptors.response.use(
(response) => response,
async (error) => {
const { config, response } = error;
config.__retryCount = config.__retryCount || 0;
// Rate limiting
if (response?.status === 429) {
const retryAfter = parseInt(response.headers['retry-after'] || '60', 10);
console.warn(`Rate limited. Waiting ${retryAfter}s...`);
await new Promise((r) => setTimeout(r, retryAfter * 1000));
return client(config);
}
// Retry on server errors (max 3)
if (response?.status >= 500 && config.__retryCount < 3) {
config.__retryCount += 1;
const delay = config.__retryCount * 2000;
console.warn(`Server error ${response.status}. Retry ${config.__retryCount}/3 in ${delay}ms`);
await new Promise((r) => setTimeout(r, delay));
return client(config);
}
// Structured error response
const errorMessage = response?.data?.error?.message
|| response?.data?.message
|| error.message;
throw new Error(`Odoo API Error [${response?.status}]: ${errorMessage}`);
}
);
return client;
}
6. حقیقی دنیا کے انضمام کی مثالیں۔
شاپائف ٹو اوڈو آرڈر سنک
class ShopifyOdooSync:
def __init__(self, odoo_client, shopify_client):
self.odoo = odoo_client
self.shopify = shopify_client
def sync_order(self, shopify_order):
# 1. Find or create customer
partner = self._get_or_create_partner(shopify_order['customer'])
# 2. Map products
order_lines = []
for item in shopify_order['line_items']:
product_id = self._find_product_by_sku(item['sku'])
if not product_id:
logger.warning(f"Product not found for SKU: {item['sku']}")
continue
order_lines.append((0, 0, {
'product_id': product_id,
'product_uom_qty': item['quantity'],
'price_unit': float(item['price']),
'discount': self._calc_discount(item),
}))
# 3. Create sale order
order_id = self.odoo.create('sale.order', {
'partner_id': partner['id'],
'client_order_ref': shopify_order['name'], # Shopify order #
'order_line': order_lines,
'note': f"Shopify Order: {shopify_order['id']}",
})
# 4. Auto-confirm if paid
if shopify_order['financial_status'] == 'paid':
self.odoo._call('/web/dataset/call_kw', {
'model': 'sale.order',
'method': 'action_confirm',
'args': [[order_id]],
'kwargs': {},
})
return order_id
def _get_or_create_partner(self, customer):
# Search by email first
existing = self.odoo.search_read('res.partner',
[('email', '=', customer['email'])],
fields=['id', 'name'], limit=1)
if existing:
return existing[0]
return {'id': self.odoo.create('res.partner', {
'name': f"{customer['first_name']} {customer['last_name']}",
'email': customer['email'],
'phone': customer.get('phone'),
})}
def _find_product_by_sku(self, sku):
products = self.odoo.search_read('product.product',
[('default_code', '=', sku)],
fields=['id'], limit=1)
return products[0]['id'] if products else None
ویب ہک وصول کنندہ (فلاسک کی مثال)
from flask import Flask, request, jsonify
import hmac
import hashlib
app = Flask(__name__)
@app.route('/webhook/odoo/order', methods=['POST'])
def handle_odoo_webhook():
# Verify signature
signature = request.headers.get('X-Odoo-Signature')
expected = hmac.new(
WEBHOOK_SECRET.encode(),
request.data,
hashlib.sha256
).hexdigest()
if not hmac.compare_digest(signature, expected):
return jsonify({'error': 'Invalid signature'}), 401
payload = request.json
event_type = payload.get('event')
if event_type == 'sale.order.confirmed':
handle_order_confirmed(payload['data'])
elif event_type == 'stock.picking.done':
handle_shipment_complete(payload['data'])
return jsonify({'status': 'ok'}), 200
7. کارکردگی کی تجاویز
| ٹپ | اثر | تفصیلات |
|---|---|---|
fields پیرامیٹر استعمال کریں۔ ہائی | صرف مطلوبہ فیلڈز کی درخواست کریں - پے لوڈ کو 5-10x کم کرتا ہے۔ | |
| بیچ بناتا ہے | ہائی | 500 ریکارڈز کے ساتھ 1 کال بمقابلہ 500 کالز - 50x تیز |
| صفحہ بندی بڑے ڈیٹاسیٹس | میڈیم | limit اور offset استعمال کریں — 100K ریکارڈ لوڈ کرنے سے گریز کریں۔ |
| صرف پڑھنے کے لیے کیش ڈیٹا | میڈیم | کیشے پروڈکٹ کیٹلاگ، زمرے (TTL 5-15 منٹ) |
استعمال کریں search_count | کم | بازیافت کرنے سے پہلے شمار کریں - صرف شمار کرنے کے لیے ڈیٹا لوڈ کرنے سے گریز کریں |
| کنکشن پولنگ | میڈیم | HTTP سیشنز کو دوبارہ استعمال کریں - TLS ہینڈ شیک اوور ہیڈ کو بچاتا ہے۔ |
اکثر پوچھے گئے سوالات
Odoo میں XML-RPC، JSON-RPC اور REST API میں کیا فرق ہے؟
XML-RPC تمام Odoo ورژنز میں دستیاب میراثی پروٹوکول ہے — یہ لفظی ہے لیکن عالمی سطح پر تعاون یافتہ ہے۔ JSON-RPC وہ پروٹوکول ہے جو Odoo کے ویب کلائنٹ کے ذریعے استعمال کیا جاتا ہے اور JSON پے لوڈز کے ساتھ وہی فعالیت فراہم کرتا ہے۔ REST API کو Odoo 17 میں متعارف کرایا گیا تھا اور API کلیدی توثیق کے ساتھ معیاری HTTP اینڈ پوائنٹس فراہم کرتا ہے، جو اسے جدید انضمام کے لیے سب سے آسان آپشن بناتا ہے۔ نئے پروجیکٹس کے لیے، REST API استعمال کریں اگر آپ Odoo 17 یا اس کے بعد کے ہیں۔
میں Odoo API کی شرح کی حدود کو کیسے ہینڈل کروں؟
Odoo.sh آپ کے پلان کے درجے کی بنیاد پر شرح کی حدود کا اطلاق کرتا ہے۔ جب آپ کو 429 جواب موصول ہوتا ہے تو دوبارہ کوشش کرنے کے بعد ہیڈر پڑھیں اور دوبارہ کوشش کرنے سے پہلے انتظار کریں۔ اعلی حجم کے انضمام کے لیے، ایکسپونینشل بیک آف کو لاگو کریں، API کالز کی تعداد کو کم کرنے کے لیے اپنے آپریشنز کو بیچیں، اور غیر اہم مطابقت پذیری کے لیے ریئل ٹائم API کالز کے بجائے بلک پروسیسنگ کے لیے Odoo کی طے شدہ کارروائیوں کو استعمال کرنے پر غور کریں۔
کیا میں API کے ذریعے اپنی مرضی کے مطابق Python طریقوں کو کال کرسکتا ہوں؟
ہاں۔ Odoo ماڈل پر کسی بھی عوامی طریقہ کو execute_kw کا استعمال کرتے ہوئے XML-RPC یا JSON-RPC کے ذریعے کال کیا جا سکتا ہے۔ REST API کے لیے، آپ کو @http.route کے ساتھ ایک حسب ضرورت کنٹرولر اینڈ پوائنٹ بنانا ہوگا۔ انڈر سکور سے شروع ہونے والے طریقے نجی ہوتے ہیں اور انہیں XML-RPC کے ذریعے بیرونی طور پر نہیں کہا جا سکتا۔ انجیکشن حملوں کو روکنے کے لیے اپنے حسب ضرورت طریقوں میں ان پٹ کو ہمیشہ درست کریں۔
میں بڑے ڈیٹاسیٹس کو مؤثر طریقے سے کیسے ہم آہنگ کروں؟
حکمت عملیوں کا ایک مجموعہ استعمال کریں: بیچ آپریشنز اور صفحہ بندی کے ساتھ ابتدائی مکمل مطابقت پذیری (فی درخواست 200 ریکارڈز کی حد)، پھر صرف آخری مطابقت پذیری کے بعد ترمیم شدہ ریکارڈز کو لانے کے لیے write_date فلٹرنگ کا استعمال کرتے ہوئے اضافی مطابقت پذیری۔ آخری مطابقت پذیر ٹائم اسٹیمپ کو اسٹور کریں اور اسے ڈومین فلٹر کے طور پر استعمال کریں۔ 100,000 ریکارڈ سے زیادہ بڑے ڈیٹاسیٹس کے لیے، API سنکرونائزیشن کے بجائے براہ راست ڈیٹا بیس کی نقل پر غور کریں۔
کیا Odoo REST API Odoo کمیونٹی ایڈیشن میں دستیاب ہے؟
API کلیدی تصدیق کے ساتھ مقامی REST API Odoo 17 انٹرپرائز میں متعارف کرایا گیا تھا۔ Odoo کمیونٹی کے لیے، آپ XML-RPC یا JSON-RPC استعمال کر سکتے ہیں جو تمام ایڈیشنز میں دستیاب ہیں، یا OCA کے ریسٹ فریم ورک جیسے کمیونٹی ماڈیولز انسٹال کر سکتے ہیں جو RESTful end points کو شامل کرتے ہیں۔ ECOSIRE کی انٹیگریشن سروسز تمام Odoo ایڈیشنز اور API پروٹوکولز کو سپورٹ کرتی ہیں۔
میں API کالز میں Many2many اور One2many فیلڈز کو کیسے ہینڈل کروں؟
ریلیشنل فیلڈز خصوصی کمانڈ ٹیپلز کا استعمال کرتے ہیں: (0, 0, ویلیوز) نیا ریکارڈ بنانے اور لنک کرنے کے لیے، (1, id, values) ایک لنک شدہ ریکارڈ کو اپ ڈیٹ کرنے کے لیے، (2, id, 0) ایک لنک شدہ ریکارڈ کو حذف کرنے کے لیے، (3, id, 0) کو حذف کیے بغیر ان لنک کرنے کے لیے، (4، id، 0) کو حذف کیے بغیر، (4، id، 0) موجودہ ریکارڈ سے لنک کرنا تمام، اور (6، 0، [ids]) تمام لنکس کو تبدیل کرنے کے لیے۔ پڑھنے کے لیے، یہ فیلڈز بطور ڈیفالٹ IDs کی فہرستیں واپس کرتی ہیں — مکمل ڈیٹا حاصل کرنے کے لیے فیلڈ کے نام کے ساتھ search_read کا استعمال کریں۔
اگلے اقدامات
API کا انضمام جدید کاروباری نظام کی ریڑھ کی ہڈی ہے۔ چاہے آپ ایک سادہ ڈیٹا سنک یا ایک پیچیدہ ملٹی پلیٹ فارم آرکیسٹریشن بنا رہے ہوں، اس گائیڈ میں پیٹرن آپ کو اچھی طرح سے کام کریں گے۔
متعلقہ وسائل:
- Odoo Python ڈویلپمنٹ گائیڈ — اوڈو کے ازگر کے پس منظر میں گہرا غوطہ لگائیں
- ویب ہُک ڈیبگنگ گائیڈ — ویب ہُک کے انضمام کا ازالہ کرنا
- ECOSIRE Marketplace Connectors — بڑے پلیٹ فارمز کے لیے پہلے سے تیار کردہ انضمام
Odoo API انضمام میں مدد کی ضرورت ہے؟ ECOSIRE کی انٹیگریشن ٹیم نے Odoo کو 50 سے زیادہ بیرونی پلیٹ فارمز سے جوڑ دیا ہے بشمول Shopify، Amazon، Salesforce، اور حسب ضرورت ERPs۔ سادہ ڈیٹا کی مطابقت پذیری سے لے کر ریئل ٹائم دو طرفہ آرکیسٹریشن تک، ہم انٹیگریشنز بناتے ہیں جو پیمانے پر ہوتے ہیں۔ مفت تکنیکی مشاورت کا شیڈول بنائیں۔
تحریر
ECOSIRE TeamTechnical Writing
The ECOSIRE technical writing team covers Odoo ERP, Shopify eCommerce, AI agents, Power BI analytics, GoHighLevel automation, and enterprise software best practices. Our guides help businesses make informed technology decisions.
متعلقہ مضامین
blog.posts.ai-powered-customer-segmentation-guide.title
blog.posts.ai-powered-customer-segmentation-guide.description
blog.posts.ai-supply-chain-optimization-2026.title
blog.posts.ai-supply-chain-optimization-2026.description
blog.posts.api-integration-patterns-enterprise-guide.title
blog.posts.api-integration-patterns-enterprise-guide.description