1、模块命名[驼峰命名方法]
res开头的是:resources 常见模型:res.users, res.company, res.partner, res.config.settings 等。。。
@api.model
def _selection_grade(self):
    res_grade = []
    grade_list = self.env['ir.config_parameter'].search([('key','like','')])
    for item in grade_list:
        res_grade.append((item.key[12:],_(item.value)))
    return res_grade2、三级联动案例:
country_id = fields.Many2one('res.country',string=u'国家')
state_id=fields.Many2one('res.country.state',domain=[('country_id','=',country_id.id)],string=u'省份')state_id=fields.Many2one('res.country.state',domain=lambda self:[('country_id','=',self.env.user.country_id.id)],string=u'省份')或<field name="country_id" />
<field name="state_id" domain="[('country_id','=',country_id)]"/>3、filtered函数用法,可以用于对many2many或one2many类字段过滤:def filtered(self, func):
""" Select the records in ``self`` such that ``func(rec)`` is true, and
        return them as a recordset.
        :param func: a function or a dot-separated sequence of field names
    """
    if isinstance(func, pycompat.string_types):
        name = func
        func = lambda rec: any(rec.mapped(name))
return self.browse([rec.id for rec in self if func(rec)])案例:filtered过滤返回的石记录集@api.constrains('product_id', 'product_tmpl_id', 'bom_line_ids')
def _check_product_recursion(self):
for bom in self:
if bom.bom_line_ids.filtered(lambda x: x.product_id.product_tmpl_id == bom.product_tmpl_id):
raise ValidationError(_('BoM line product %s should not be same as BoM product.') % bom.display_name)4、notify通知
javascript:/**
var core = require('web.core');
core.action_registry.add('action_notify', function(element, action){
    var params = action.params;
    if(params){
        element.do_notify(params.title, params.text, params.sticky);
    }
    return {'type':'ir.actions.act_window_close'};
});
py用法
def action_notify(self, title=u'默认通知标题', text=u"默认通知内容", sticky=False):
    return {
        "type": "ir.actions.client",
        "tag": "action_notify",
        "params": {
            "title": title,
            "text": text,
            "sticky": sticky
        }
    }
案例:flask与odoo对接接口# -*- coding: utf-8 -*-
from flask import Flask, g, jsonify
from flask_restful import Api
from flask_cors import CORS
from resource.partner import PartnerAPI
app = Flask(__name__)
api = Api(app)
CORS(app, supports_credentials=True)
@app.after_request
def after_request(response):
    response.headers['Access-Control-Allow-Origin'] = '*'
    return response
@app.route('/')
def index():
    return "hello,%s!" % g.username
@app.errorhandler(403)
def permission_denied(error=None):
    message = {
        "return_msg": "permission denied",
        "return_code": 403
    }
    return jsonify(message), 403
# 绑定资源和路由'
api.add_resource(PartnerAPI, 'api/v1.0/partner/<int id>')
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)# -*- coding: utf-8 -*-
import odoorpc
from flask import Flask, g, jsonify, request
from flask_restful import Resource
from common import error_code
import logging
FORMAT = "%(asctime)s%(thread)d%(message)s"
logging.basicConfig(level=logging.INF, format=FORMAT)
class PartnerAPI(Resource):
    def get(self, id):
        odoo = odoorpc.ODOO('localhost', port=8069)
        odoo.login('database_name', 'admin', 'admin')
 order_code = request.args['order_code']
        domain = [('name', '=', order_code)]
        order_list = odoo.env['sale.order'].search(domain, ['partner_id', 'name', 'order_line'])
        partner = odoo.env['res.partner'].browse(id).read(['id', 'name'])[0]
        if order_list:
            for order in order_list:
                order['partner_name'] = order['partner_id'][1]
        if partner:
            api_result = {
                'return_code': 200,
                'return_message': 'success',
                'data': partner
            }
            return jsonify(api_result)
    心有猛虎,细嗅蔷薇
    
    
    










