odoo之Web Controllers(二)

使用步骤

1) 导包

from odoo import httpfrom odoo.http import request

2)类创建

class Yp32011(http.Controller):
	....

3) 函数定义

GET

  • 返回字符串
    @http.route('/index', auth='public', methods=["GET"],csrf=False, cors='*')
    def index(self):
        return "Hello, world"
    
  • 返回json
    • 不带参数
      @http.route('/projects', auth='public', methods=["GET"],csrf=False, cors='*')
      def projects(self):
          project_obj = http.request.env["yp32011.inspection_project"].sudo().search([])
          result = [{
                      "id": record.id,
                      "name": record.name,
                  }
                  for record in project_obj]
          return json.dumps(result)
      
      用SQL写法等同于
      @http.route('/projects', auth='public', methods=["GET"],csrf=False, cors='*')
      def projects_SQL(self):
          http.request.env.cr.execute("select * from yp32011_inspection_project")
          result = http.request.env.cr.fetchall()
          result = [{
                      "id": record[0],
                      "name": record[1],
                  }
                  for record in result]
      	return json.dumps(result)
      
    • 带参数
      1)通过设置关键字参数获取
      @http.route('/projects/<int:project_id>', auth='public', methods=["GET"],csrf=False, cors='*')
      def projects(self,project_id=None):
          project_obj = http.request.env["yp32011.inspection_project"].sudo().search([('id','=',project_id)])
          ...
      
      2)通过设置不定长参数kwargs获取
      @http.route('/projects/<int:project_id>', auth='public', methods=["GET"],csrf=False, cors='*')
      def projects(self,**kwargs):
      	# kwargs是个字典
          project_id=kwargs.get('project_id') # 或 kwargs['project_id']
          project_obj = http.request.env["yp32011.inspection_project"].sudo().search([('id','=',project_id)])
           ...
      

POST

apipost传递的参数

{
	"params": {
		"data": {
			"name": "test2",
			"inspected_procedure":[1],
		}
	}
}

1) 通过http.request.jsonrequest获取参数

@http.route('/project', auth='public', methods=["POST"], type="json",csrf=False, cors='*')
def create_project(self):
    param = http.request.jsonrequest['params']
    # param是个字典
    vals={
        'name':param['data']['name'],
        'inspected_procedure':param['data']['inspected_procedure']
    }
    print(vals)
    http.request.env["yp32011.inspection_project"].sudo().create(vals)
    result={
        "code":200,
        "message":"ok",
        "data":"新建项目成功"
    }
    return json.dumps(result,ensure_ascii=False)

2) 通过设置不定长参数kwargs获取

@http.route('/project', auth='public', methods=["POST"], type="json",csrf=False, cors='*')
def create_project(self,**kwargs):
    vals={
        'name':kwargs['data']['name'], # 或 kwargs.get('data').get('name')
        'inspected_procedure':kwargs['data']['inspected_procedure']
    }
	......

PUT

1)通过设置关键字参数获取获取需修改的记录ID
2)通过http.request.jsonrequest获取需修改的参数内容

@http.route('/projects/<string:pk>', methods=["PUT"], type="json", auth='public', csrf=False, cors='*')
def update_project(self, pk=None):
    param = http.request.jsonrequest
    project_obj = http.request.env["yp32011.inspection_project"].sudo().search([("id", "=", pk)])
    if not project_obj:
        return json.dumps("not exists")
    project_obj.name = param['params']['data']["name"]
    result = [{
        "id": record.id,
        "name": record.name,
    }
        for record in project_obj]
    return json.dumps(result)

DELETE

通过设置关键字参数获取获取需删除的记录ID

@http.route('/projects/<string:pk>', methods=["DELETE"],auth='public', csrf=False, cors='*')
def delete_project(self, pk=None):
    project_obj = http.request.env["yp32011.inspection_project"].sudo().search([("id", "=", pk)])
    if not project_obj:
        return json.dumps("not exists")
    project_obj.unlink()
    result={
        "code":200,
        "message":"ok",
        "data":"删除项目成功"
    }
    return json.dumps(result,ensure_ascii=False)

用法汇总

  • 查看search(domian)
     result = http.request.env['bim5d.quality_standard'].search( [
         ('project_budget','=',project_id),
         ('state','=','done')
     ])
    
  • 查找总数:search_count(domian)
    result = http.request.env["bim5d.quality_record"].sudo().search_count([])
    
  • 使用SQL:cr.execute(“sql语句”,param)
     http.request.env.cr.execute("select count(*) from (select DISTINCT header,feedback from bim5d_problem_record) t")
     result = http.request.env.cr.fetchone()
    
  • 返回xml模版页面
    return request.render("模块名.template_id", values)
    
  • 返回json数据集
    return json.dumps(values)
    

注:domain是一种表达式,通常用来筛选数据记录。

常用函数方法

  • create(dics):在数据表中插入一条记录,返回新对象。

  • search(domain):查询符合条件的对象列表,返回对象列表。

  • search(domain, limit=1):查询符合条件的一个对象,返回一个对象。

  • search_read(domain, fields):查询符合条件的字典列表。返回指定fields的字典列表。

  • browse(id):浏览对象及其关联对象。返回对象。

  • browse([ids]):浏览对象列表,返回对象列表

  • browse(id).read(fields):浏览对象及其关联对象,返回字典

  • search(domain).read(fields):返回记录集的指定字段值列表。返回字典列表

  • write(dics):保存一个或几个记录的一个或几个字段。返回布尔值,True

  • unlink:删除一个或几个记录

  • default_get:复位一个或多个字段的缺省值

  • default_set:重置字段的缺省值

猜你喜欢

转载自blog.csdn.net/weixin_44141284/article/details/130583293