odoo16--接口编写小白教程--03
使用ORM操作odoo数据库中的信息
目标:为猫猫选择一个或多个性格标签
定义介绍:在Odoo框架中,ORM是指“数据访问层”,其作用是将数据库与Python对象之间转换。它允许开发人员使用Python代码操作数据库而无需关心具体数据库的细节。ORM不仅简化了数据库操作,还提供了丰富的查询API,使开发人员可以更轻松地执行复杂的查询。
步骤1:新增一个model数据表记录性格标签,并关联对应关系
- 在model中新建一个性格模块py文件
from odoo import models,fields,api
class Personality(models.Model):
_name = "personality"
_description = 'cats personality'
name = fields.Char(string='猫咪性格')
#_sql_constraints属性包含了一个元组类型的列表,其中包含三个项:约束名称、SQL语句和错误消息。
#在这种情况下,SQL约束是unique(name),这意味着“name ”字段必须是唯一的。
#如果有重复,就会显示错误消息:“数据表中已有该性格!”
_sql_constraints = [
('unique_personality_name', 'unique(name)', '数据表中已有该性格!'),
]
- 在security文件夹下的ir.model.access.csv文件中添加此model的权限
access_personality,personality.personality,model_personality,base.group_user,1,1,1,1
- 一个猫猫对可以有多种性格,而一种性格也可以对应多个猫猫,因此猫猫与性格的对应关系为:多对多。我们在存储猫猫信息的数据模块文件中写入关联关系:
#第一个参数'personality'为性格数据表的模块名
personality_id = fields.Many2many('personality',string='猫咪性格')
- 在view文件夹中找到猫猫信息的视图,并为form视图加入猫猫性格字段
#widget是odoo的小部件,这里为我们提供了一个更美观的展示,可以在网上搜索更多的部件展示
<field name="personality_id" widget='many2many_tags'></field>
- 重启并在odoo社区进行模块升级,在为猫猫添加性格标签时,如有重名则报错
我们在猫猫性格这一栏目中填入两个同名性格则会提示错误信息
步骤2:模拟前端在postman获取性格表中的所有信息
- 首先我们设定需求:用户点击猫猫性格选择框,弹出所有猫猫性格标签的选项,用户点击选项进行多选或单选:
- 我们首先实现第一步:用户点击猫猫性格框,出现所有性格选项
# 查看猫咪性格表
@http.route('/getCatPersonality', type='json', auth="none", cors="*", csrf=False)
def getCatPersonality(self, **kw):
personality_obj = request.env['personality'].sudo()
personality_id = personality_obj.search([])
result=[]
for personality in personality_id:
result.append({
"name":personality.name,
"id":personality.id
})
return {
"code":1,
"result":result
}
- 这里返回给前端的参数有:性格标签名name、性格标签id
步骤3:根据用户所选的性格标签写入某一只猫猫的信息表中
- 前端可以拿到用户选择的性格标签id,以列表的形式传给我们,我们根据前端传来的id调出对应的性格标签写入某一只猫猫信息
# 选择性格
'''
uid 猫猫id
personality_id 性格标签id[传入一个列表形式]
'''
@http.route('/writePersonalSkill', type='json', auth='none', cors='*', csrf=False)
def writePersonalSkill(self, **kw):
cat_obj = request.env['my.cats'].sudo()
cat_id = cat_obj.search([('id','=',int(kw['uid']))])
if not cat_id:
return{
'code':1,
'result':"该猫猫不存在"
}
personality = cat_id.write({
#清除当前引用的记录来将它们替换为ID列表中包含的记录
#False表示是否要同时创建相关记录
#将传入的id列表作为新的记录进行存放
'personality_id':[(6,False,kw['personality_id'])]
})
return{
'code':1,
'result':personality
}
- 我们将获取到的所有性格标签选择其中两个:id为5 6的性格,写入测试猫猫中,将此时猫猫性格中的“高冷”,“能吃” 变成 “傻”,“能吃”
- 在postman中模拟前端用户进行选择并改写某一猫猫的性格标签
刷新odoo社区,可以看到猫猫的性格已经改写为“傻”,“能吃”
- 如果在性格表中并未找到适合的性格标签,则可以为用户创建一个新建接口
#新增猫猫的性格
'''
name 猫咪性格
'''
@http.route('/createCatPersonality', type='json', auth="none", cors="*", csrf=False)
def createCatPersonality(self, **kw):
personality_obj = request.env['personality'].sudo()
personality_id = personality_obj.search([])
id_list=[]
for personality in personality_id:
id_list.append({
"name":personality.name
})
if str(kw['name']) in id_list:
return{
'code':1,
'result':'性格表中已有此性格,请进行选择'
}
else:
personalitys = personality_obj.create({
'name':kw.get('name')
})
return{
'code':1,
'personality_id':personalitys.id,
'result':'已创建该性格'
}
- 本篇中完成了针对多对多关系的数据调用,多对一与一对多的关系可以直接使用基本的增删改查