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) is_example = fields.Boolean(u'示例')class IsleepGenericDrug(osv.osv): _name = 'isleep.generic.drug' _description = u'藥品通用名' _columns = { 'name': fields.char(u'藥品通用名稱', required=True, select=True),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)
@http.route('/isleep/patientapp/guide/disease/save', type='json', auth='none')def isleep_patientapp_guide_disease_save(self, req, **kw):
subscribe = req.jsonrequest.get('subscribe')) 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表,紀錄兩張表之間的對應關系。。。
| one2many 屬性 |
(0, 0,{ values })根據 values 里面的信息新建一個記錄 |
(1,ID,{values}) 更新 id=ID 的記錄(對 id=ID 的執行 write 寫入 values 里面的數據) |
(2,ID) 刪除 id=ID 的數據(調用 unlink 方法,刪除數據以及整個主從數據鏈接關系) |
在數據庫表中該one2many字段并不存在。
新聞熱點
疑難解答