Lập trình OdooOpenERP Phần 4: Các phương thức ORM trong OdooOpenERPHướng dẫn sử dụng cơ bản các phương thức ORM trong OdooOpenERP bao gồm các phương thức như read, write, create, search, unlinkPHương pháp override các phương thức trên
Trang 1LAB_4 ORM METHOD
MÃ NGUỒN MỞ
TRƯỜNG ĐẠI HỌC NGUYỄN TẤT THÀNH
KHOA CÔNG NGHỆ THÔNG TIN
Hướng dẫn: Nguyễn Yên Bảo Điện thoại:
Email: nybao@ntt.edu.vn
Trang 2NỘI DUNG
2
1. Giới thiệu về ORM
2. Các phương thức thường dùng trong ORM
3. Override các phương thức trong ORM
4. Những cải tiến trong Odoo (v8)
Trang 3NỘI DUNG
3
1. Giới thiệu về ORM
2. Các phương thức thường dùng trong ORM
3. Override các phương thức trong ORM
4. Những cải tiến trong Odoo (v8)
Trang 41 GIỚI THIỆU VỀ ORM
Cho phép thao tác trên table
trong CSDL mà không cần phải quan tâm nhiều đến việc viết các câu truy vấn cho mỗi lần truy xuất CSDL
Trang 51 GIỚI THIỆU VỀ ORM
5
Ưu điểm
Độc lập hệ quản trị cơ sở dữ liệu
Cung cấp các API đơn giản – dễ dùng
Giúp cho bản thiết kế gần gũi với lập trình viên
Nhược điểm
Các ORM thường tự sinh ra SQL để select, insert, update, delete… khó can thiệp sâu để tối ưu hóa Ảnh hưởng đến hiệu suất
Cấu trúc bảng bên dưới sẽ phức tạo nếu lạm dụng việc kế thừa quá nhiều
Khó khăn trong việc quản lý session
Trang 62 PHƯƠNG THỨC ORM THƯỜNG DÙNG
6
Odoo framework hỗ trợ rất nhiều phương thức giúp
chúng ta tương tác với CSDL cũng như thực hiện 1 số chức năng mở rộng
Các đối tượng trong Odoo được thừa kế từ lớp osv.osv nên các đối tượng này đều thừa kế tất cả các phương thức ORM
Chúng ta có thể gọi đến các phương thức này ngay
bên trong đối tượng; hoặc có thể tạo ra một thể hiện của đối tượng, rồi sau đó gọi các phương thức này từ các thể hiện đó
Trang 7self.pool.get( x_khoa' ).test_method()
Trang 82 PHƯƠNG THỨC ORM THƯỜNG DÙNG
cr kết nối cơ sở dữ liệu (con trỏ csdl)
uid id của người dùng đang thao tác (current id)
id hoặc
ids
là một list chứa các id của các bản ghi; hoặc là 1 số nguyên duy nhất khi chỉ có một id.
context là một dictionaries chứa các tham số về ngữ cảnh như: ngôn
ngữ sử dụng là gì, múi giờ là gì, model nào đang đang được
sử dụng, id là bao nhiêu Hoặc chúng ta có thể thêm các ngữ cảnh để xử lý trong 1 số trường hợp cụ thể
Ví dụ: {'lang': 'en_US', ‘khongdcxoa’:True }
Trang 9Browse Trả về các bản ghi (record) ở dạng đối tượng hoặc một list các
đối tượng; cho phép truy xuất tới từng trường (field) hoặc các
quan hệ của đối tượng bằng cách dùng kí pháp dấu '.'
Read Lấy ra 1 số field đã chỉ định trong các record được truyền vào
(Tương đương với SQL: SELECT cot1,cot2 FROM model WHERE id=…)
Create Tạo ra một bản ghi mới với giá trị được truyền vào (tương
đương với button CreateSave trên giao diện hoặc lệnh INSERT trong SQL)
Write Cập nhật thông tin cho các bản ghi có id trong danh sách ids
được truyền vào ( với button EditSave hoặc lệnh UPDATE) Unlink Xóa các bản ghi có id nằm trong danh sách ids được truyền vào Search Tìm 1 số bản ghi thỏa mãn các điều kiện mà chúng ta truyền vào Copy Tạo bản sao của một bản ghi; một số trường sẽ lấy giá trị mặc
định mà ta đã định sẵn ( với button Duplicate)
Trang 102 PHƯƠNG THỨC ORM THƯỜNG DÙNG
Trang 11Giả xử chúng ta đang thực hiện code trong đối tượng x_sinhvien
- Thực hiện bên trong đối tượng
ids = [1,2,3,4,5]
dssinhvien = self.browse(cr, uid, ids, context=context)
print dssinhvien[0].masv
print dssinhvien[1].nganh.id
- Thực hiện cho các đối tượng bên ngoài
nganh_obj = self.pool.get( 'x_nganh' )
nganh_ids = [9,10]
dsnganh = self.browse(cr, uid, nganh_ids, context=context)
print dsnganh[0].manganh
Trang 122 PHƯƠNG THỨC ORM THƯỜNG DÙNG
- Một list các dictionary với key là tên trường, và value
là giá trị của các trường cần lấy
- [{'name' : 'bao' , 'tuoi' : 24 },{ 'name' : 'minh' , 'tuoi' : 25 }]
Cú pháp
- read(cr, uid, ids, list_field, context=context)
Trang 13Giả xử chúng ta đang thực hiện code trong đối tượng x_sinhvien
- Thực hiện bên trong đối tượng
read_sv = self.read(cr,uid,ids,[ 'masv' , 'name' , 'gioitinh' ])
print read_sv[0]['name' ]
- Thực hiện cho các đối tượng bên ngoài
nganh_obj = self.pool.get( 'x_nganh' )
read_nganh=nganh_obj.read(cr,uid,nganh_ids,
['manganh' , 'name' , 'gioitinh' ])
print dsnganh[0].manganh
Trang 142 PHƯƠNG THỨC ORM THƯỜNG DÙNG
14
2.3 Create
Input
- Một dictionary các record mà chúng ta muốn thêm vào
- Với key là tên field và value là giá trị của field
Output
- ID của record vừa tạo
Cú pháp
- create(cr, uid, vals, context=context)
- Với vals là 1 dictionary
Trang 15Giả xử chúng ta đang thực hiện code trong đối tượng x_sinhvien
- Thực hiện bên trong đối tượng
vals = {'mssv' : '1000' , 'name':'nguyễn yên bảo' } new_id = self.create(cr,uid,vals,context=context)
print new_id
- Thực hiện cho các đối tượng bên ngoài
nganh_obj = self.pool.get( 'x_nganh' )
vals = {'msnganh' : '2000' , 'name':'CNTT' }
nganh_id = nganh_obj.create(cr,uid,vals,context=context)
print nganh_id
Trang 162 PHƯƠNG THỨC ORM THƯỜNG DÙNG
16
2.4 Write
Input
- ID hoặc danh sách các ID của record cần cập nhật
- Một dictionaries với key là tên field cần cập nhật và values là các giá trị mới cần cập nhật
Trang 17Giả xử chúng ta đang thực hiện code trong đối tượng x_sinhvien
- Thực hiện bên trong đối tượng
ids = [ 4 , 5 ]
vals = {'gioitinh' : 'nam' } self.write(cr,uid,ids,vals,context=context)
- Thực hiện cho các đối tượng bên ngoài
nganh_obj = self.pool.get( 'x_nganh' )
ids = [10,15]
vals = {‘name' : ‘Quản trị kinh doanh' } nganh_obj.write(cr,uid,ids,vals,context=context)
Trang 182 PHƯƠNG THỨC ORM THƯỜNG DÙNG
Trang 19Giả xử chúng ta đang thực hiện code trong đối tượng x_sinhvien
- Thực hiện bên trong đối tượng
ids = [ 4 , 5 ]
self.unlink(cr, uid, ids, context=context)
- Thực hiện cho các đối tượng bên ngoài
nganh_obj = self.pool.get( 'x_nganh' )
ids = [10,15]
nganh_obj.unlink(cr, uid, ids, context=context)
Trang 202 PHƯƠNG THỨC ORM THƯỜNG DÙNG
20
2.6 Copy
Input
- ID của record cần nhân bản (Chỉ có 1 ID)
- Một dictionaries với key là tên field và key là giá trị mặc định Sau khi copy thì các trường dữ liệu sẽ có giá trị giống như bản cũ, chỉ khác ở các field mà ta đã chỉ ra trong dictionaries (defaults)
Trang 21Giả xử chúng ta đang thực hiện code trong đối tượng x_sinhvien
- Thực hiện bên trong đối tượng
defaults = { 'nganh' : 10 }
id = 12 self.copy(cr, uid, id, defaults,context=context)
- Thực hiện cho các đối tượng bên ngoài
nganh_obj = self.pool.get( 'x_nganh' )
id = 1 5
defaults = { 'diachi' : 'Nguyễn Khoái' } nganh_obj.copy(cr, uid, id, defaults, context=context)
Trang 222 PHƯƠNG THỨC ORM THƯỜNG DÙNG
22
2.7 Search
Input
- args: một list các tuple chứa các tiêu chí tìm kiếm
['|' , ( 'id' , 'in' , [ 1 , 2 , 3 ]), ( 'name' , 'like' , 'Nguyễn%' )]
- Các option input
• offset: bắt đầu lấy các record từ vị trí nào
• limit: giới hiện số lượng các record trả về
• order: sắp xếp thứ tự các record
• count: nếu True, trả về số lượng record được tìm
thấy (Không trả về ids)
• Các toán tử: =, !=, >, >=, <, <=, like, ilike, in, not in, child_of, parent_left, parent_right
• Các toán tử kết hợp: '&' (mặc định), '|', '!'
Trang 242 PHƯƠNG THỨC ORM THƯỜNG DÙNG
24
2.7 Search
Ví dụ
Giả xử chúng ta đang thực hiện code trong đối tượng x_sinhvien
- Thực hiện bên trong đối tượng
all_sv_ids = self.search(cr,uid,ids,[],context=context) order_name = self.search(cr,uid,ids,[],order='name desc' )
top10_mssv = self.search(cr,uid,ids,[],order='mssv asc' ,limit= 10 )
bao_name = self.search(cr,uid,ids,['name' , 'like' , '%Bảo' ])
bao_name_id = self.search(cr,uid,ids,['|', ( 'name' , 'like' , '%Bảo'),
Trang 252 OVERRIDE CÁC PHƯƠNG THỨC TRONG ORM
25
2.7 Search
Trang 264 Q/A
Trang 2727
1 Xây dựng module “quản lý sinh viên”:
2 Mô tả:
Có bao nhiêu đối tượng (sinh viên, khoa, ngành…)
Thuộc tính của từng đối tượng
5 BÀI TẬP
Trang 28The End.