Odoo 15与Django集成:构建REST API时如何连接Odoo数据库?
连接Odoo数据库并在Django REST API中获取数据的方法
方法1:使用Odoo官方RPC API(推荐)
Odoo原生支持XML-RPC和JSON-RPC接口,这是官方认可的安全方式,无需直接操作底层数据库,能兼容Odoo的权限控制和业务逻辑。
实现步骤:
- 安装依赖:
pip install xmlrpc(若用JSON-RPC可搭配requests) - 在Django中编写连接与调用代码:
import xmlrpc.client def connect_odoo_fetch_data(): # 替换为你的Odoo实例信息 odoo_url = "http://your-odoo-server-ip:8069" db_name = "your_odoo_database" username = "odoo_user" password = "odoo_password" # 认证获取用户ID common_proxy = xmlrpc.client.ServerProxy(f"{odoo_url}/xmlrpc/2/common") uid = common_proxy.authenticate(db_name, username, password, {}) # 调用模型接口 model_proxy = xmlrpc.client.ServerProxy(f"{odoo_url}/xmlrpc/2/object") # 示例:获取企业客户数据 customer_data = model_proxy.execute_kw( db_name, uid, password, "res.partner", "search_read", [[["is_company", "=", True]]], {"fields": ["name", "email", "phone"], "limit": 20} ) return customer_data
- 在Django REST API的视图中调用上述函数,通过序列化器返回标准化的API响应。
方法2:直接连接Odoo的PostgreSQL数据库
如果需要执行复杂的跨表查询或追求极致性能,可直接连接Odoo使用的PostgreSQL数据库,但需注意Odoo表结构复杂,直接写入可能破坏数据一致性,仅建议用于只读场景。
实现步骤:
- 安装依赖:
pip install psycopg2-binary - 在Django的
settings.py中添加Odoo数据库配置:
DATABASES = { 'default': { # 你的Django主数据库配置 }, 'odoo_db': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'your_odoo_database', 'USER': 'postgres', # Odoo数据库用户,通常是postgres 'PASSWORD': 'db_password', 'HOST': 'localhost', # Odoo数据库所在主机 'PORT': '5432', } }
- 使用Django的多数据库查询语法获取数据:
from django.db import connection def fetch_odoo_customers_via_db(): with connection.cursor() as cursor: cursor.execute(""" SELECT name, email, phone FROM res_partner WHERE is_company = true LIMIT 20; """) rows = cursor.fetchall() # 转换为字典格式便于序列化 return [{"name": row[0], "email": row[1], "phone": row[2]} for row in rows]
注意:需提前熟悉Odoo的表结构命名规则(如
res_partner对应客户模型),避免误查或误操作。
方法3:使用第三方封装库
借助odoorpc这类第三方库,可简化Odoo连接与数据操作的代码:
- 安装依赖:
pip install odoorpc - 示例代码:
import odoorpc def get_odoo_data_with_odoorpc(): odoo = odoorpc.ODOO("your-odoo-server-ip", port=8069) odoo.login("your_odoo_database", "odoo_user", "odoo_password") # 直接调用Odoo模型的方法 customers = odoo.env["res.partner"].search_read( [["is_company", "=", True]], ["name", "email", "phone"], limit=20 ) return customers
内容的提问来源于stack exchange,提问作者Mahfujul Hasan
相关产品推荐
相关产品推荐

