odoo关系型字段domain写法

1.  多对一关系: Many2one

2. 多对多关系: Many2many

3. 一对多关系: One2many

 

1.  多对一关系: Many2one

 

 

ondelete 属性 

no atction:相互不影响

cascade:主键被删除,外键对应的记录也删除。直接删除外键的记录,不影响主键。

restrict: 如果存在外键,主键删除的时候报错。

set null:主键被删除,外键变为空值。

set default:主键被删除,外键变为默认值。

 
 
 

模型定义

#模型新式写法
class IsleepDoctorSayDrug(models.Model):
     _name = 'isleep.doctorapp.drug'
     _description = u'医生说药的药品'

     base_drug_id = fields.Many2one('isleep.drug', u'关联基础药品', required=True, ondelete="cascade")     #####在数据表中Many2one字段存在
     generic_id = fields.Many2one('isleep.generic.drug', u'通用名', index=True, related='base_drug_id.generic_id', readonly=True) ##related的作用是选择了基础药品后,通用名自动选择了,因为基础药品包含了通用名
     is_example = fields.Boolean(u'示例')

#模型旧式写法
class IsleepGenericDrug(osv.osv):
    _name = 'isleep.generic.drug'
    _description = u'药品通用名'
    _columns = {
        'name': fields.char(u'药品通用名称', required=True, select=True),

接口函数

@http.route('/isleep/patientapp/guide/disease/get', type='http', auth='none')
def test_many2one(self, req, **kw):
       """
       :params args:
             *drug_id
             *name
       """
       base_drug_id = int(kw.get('base_drug_id', -1))
       name = kw.get('name', '')
       doctorapp_durg_obj = req.env['isleep.doctorapp.drug'].sudo()
       doctorapp_durg_data = doctorapp_durg_obj.search([('base_drug_id', '=', base_drug_id), ('generic_id.name', '=', name)])
       ret = {
            'base_drug_id': doctorapp_durg_data.base_drug_id.name,
            'is_example': doctorapp_durg_data.is_example,
       }
      return make_response('S0000', ret)

请求接口函数返回结果

return:   
        "data": {
              "base_drug_id":  "1112",
              "is_example":  false
        }


条件:如果有基础药品base_drug_id和通用名称name, 求(医生说药的药品)?

答:比较简单的方法(一条search)

doctorapp_durg_obj.search([('base_drug_id', '=', base_drug_id), ('generic_id.name', '=', name)])  

直接得出(医生说药的药品)对象


2. 多对多关系: Many2many

 

many2many 属性 

 (0,0,{values}) 根据 values 里面的信息新建一个记录。 

(1,ID,{values})更新 id=ID 的记录(写入 values 里面的数据) 

(2,ID) 删除 id=ID 的数据(调用 unlink 方法,删除数据以及整个主从数据链接关系) 

(3,ID) 切断主从数据的链接关系但是不删除这个数据 

(4,ID) 为 id=ID 的数据添加主从链接关系。 

(5) 删除所有的从数据的链接关系就是向所有的从数据调用(3,ID) 

(6,0,[IDs]) 用 IDs 里面的记录替换原来的记录(就是先执行(5)再执行循环 IDs 执行(4,ID) 

 

 

模型定义

class IsleepDoctorImportantPatient(models.Model):
    _name = "isleep.doctor.patient.rel"
    
    important = fields.Boolean(u"是重要患者")
    remark = fields.Text(u'备注信息')
    patient_id = fields.Char(string=u'患者', index=True, required=True)
    
    diseases = fields.Many2many('isleep.hospital.disease', 'isleep_hospital_disease_patient_rel', 'patient_id','disease_id', u'疾病')
    subscribe = fields.Boolean(u'正在关注')
    
    _sql_constraints = [
        ('record_uniq', 'unique(patient_id)', u'请勿创建重复数据(患者相同)')
    ]


class IsleepHospitalDisease(models.Model):
    _name = 'isleep.hospital.disease'
    _description = u"疾病模型"

    code = fields.Char(u'编码')
    priority = fields.Integer(u'优先级', default=1000, index=True)
    close = fields.Boolean(u'禁用', default=False) 

接口函数

def isleep_patientapp_guide_disease_save(self, req, **kw):
    disease_id = req.jsonrequest.get('disease_id'))
    doctor_patient_obj = req.env['isleep.doctor.patient.rel'].sudo()

    doctor_patient = doctor_patient_obj.search([('patient_id', '=', patient_id), ('subscribe', '=', True)])

    if doctor_patient:
        doctor_patient[0].write({
            'subscribe': True,
            'diseases': [(6, 0, [disease_id])]       #替换原来的记录
    })

场景:一个患者只能有一个疾病。。。

         患者-首页,编辑您选择的疾病, 一次只能单选,当下一次再编辑的时候, 替换之前选择的疾病, 

注释:diseases = fields.Many2many('isleep.hospital.disease','isleep_hospital_disease_patient_rel', 'patient_id', 'disease_id', u'疾病')

         isleep.hospital.disease必填关联的对象

        isleep_hospital_disease_patient_rel:  新增的关联表 

        patient_id当前对象的 ID 

        disease_id:   isleep.hospital.disease对象 ID

 
条件: 如果知道患者id和 禁用cloe=True,求   isleep.doctor.patient.rel 纪录, 及该纪录下有多少个疾病
答: 一条search就搞定。。。

       doctor_patient_data = rel_obj.search([('patient_id''='patient_id)('diseases.close''='close)])

       该纪录 len(doctor_patient_data) = 1

       该纪录下的疾病 len(doctor_patient_data.diseases) = 2 

在数据库表中该字段(diseases)并不存在。存在的是 isleep_hospital_disease_patient_rel表,纪录两张表之间的对应关系。。。


3. 一对多关系: One2many

 

 

 one2many 属性 

(0, 0,{ values })根据 values 里面的信息新建一个记录

(1,ID,{values}) 更新 id=ID 的记录(对 id=ID 的执行 write 写入 values 里面的数据)

(2,ID) 删除 id=ID 的数据(调用 unlink 方法,删除数据以及整个主从数据链接关系)

 
 
 

 模型定义

class IsleepElearningLibrary(models.model):
    _name = "isle.elearning.library"
    _description = u"题库"
    _order = 'create_date desc'

    name = fields.Char(u'名称’)
    question_ids = fields.One2many('sleep.elearning.library.question', 'library_id', u'题目')


class IsleepElearningLibraryQuestion(models.model):
    _name = "isleep.elearning.library.question"
    _description = u'题库题目'
    _order = 'create_date desc'

    library_id = fields.Many2one('isleep.elearning.library', u'所属题库', ondelete ="cascade")
    name = fields.Char(u'题目名称')

在数据库表中该one2many字段并不存在。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里风雪

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值