ประเภทของ ondelete 3 วิธีใน Odoo code

ประเภทของ ondelete option ใน fields.Many2one มีอยู่ด้วยกัน 3 แบบ

  1. fields.Many2one(‘model’, ondelete=’cascade‘)
    • หมายความว่า ถ้าข้อมูลรายการของ model ที่ถูกอ้างถึงถูกลบ รายการผู้อ้างก็จะถูกลบไปด้วย
  2. fields.Many2one(‘model’, ondelete=’restrict‘)
    • หมายความว่า ถ้าข้อมูลรายการของ model ที่ถูกอ้างถึงถูกลบ ระบบจะเตือนว่ามีรายการอื่นที่ยังอ้างถึงอยู่และระบบจะไม่ยอมให้ลบ
  3. fields.Many2one(‘model’, ondelete=’set null‘)
    • หมายความว่า ถ้าข้อมูลรายการของ model ที่ถูกอ้างถึงถูกลบก็ยอมให้ลย แต่ระบบจะ set null ในฟิลด์นี้ของรายการที่อ้ง

การประกาศว่า cascade แต่ละแบบเหมาะสมกับแต่ละสถานการณ์ไม่เหมือนกัน

Cascade

มักใช้กับ Document ที่มีส่วนหัวและส่วนรายการที่ถึงเป็นเอกสารเดียวกัน อย่างเช่น Sales Order มี Sales Order Line, ใน sales order line จะมีการสร้าง

order_id = fields.Many2one(‘sale.order’, ondelete=’cascade’)

ซึ่งจะให้เมื่อ Sales Order ถูกลบ Sales Order Line ก็จะถูกลบไปด้วย ซึ่งเป็นสิ่งที่ถูกต้อง

Restrict

มักใช้กับการอ้างถึง Master Data เช่น Sales Order มีการอ้างถึงลูกค้า

partner_id = fields.Many2one(‘res.partner’, ondelete=’restrict’)

และเนื่องจากการลบ master data ลูกค้า เราคงไม่อยากให้ระบบลบ Sales Order ทั้งระบบที่อ้างถึงลูกค้านี้ด้วยแน่ (ถ้าใช้ cascade) ดังนั้นการใช้ restrict เพื่อไม่ยอมให้มีการลบลูกค้าที่มีใช้ใน Sales Order แล้วจึงเหมาะสม

Set Null

น่าจะเป็นประเภทที่ใช้น้อยที่สุด การที่ยอมให้ระบบลบข้อมูลที่ถูกอ้างถึงในรายการอื่นๆและ set null ไปที่รายการนั้นๆโดยไม่แจ้งเตือนอะไร น่าจะเป็นสิ่งที่ไม่พึงประสงค์ในระบบ ERP หากแต่เป็นข้อมูลที่ไม่มีความสำคัญมากนักก็อาจพอยอมได้

 

Some cool Odoo command that we forgot

Though I have done a lot of coding in Odoo, but after I bought the book Odoo 10 Development Essential and start reading it. It reminds me many of the command that I forgot. Here are some of them,

Save default config file

Create and save default config file ~/.odoorc using –save when starting Odoo server

Bypassing ORM security

Bypassing ORM security with auto_join=True. It allows the ORM to use SQL joins when doing searches using this relationship. If used, the access security rules will be bypassed, and the user

Hierarchic relationships

For performance consideration, we use _parent_store with parent_left and parent_right

class Tags(models.Model):
  _parent_store = True
  parent_id = fields.Many2one(
    'todo.task.tag', 'Parent Tag', ondelete='restrict')
  parent_left = fields.Integer('Parent Left', index=True)
  parent_right = fields.Integer('Parent Right', index=True)

Show Inactive Records in Tree View

Normally, tree view will show only active record. We can force it to show active also by passing {‘active_test’: False} in Action Context

Reference Fields

Normal Many2one field can only reference 1 model. But if we want to have a field that can reference to more than 1 model, we can use fields.Reference. Following example, refers_to field can refer to both user or partner.

refers_to = fields.Reference(
  [('res.user', 'User'), ('res.partner', 'Partner')],
  'Refers to',
)

รู้เขา รู้เรา คือจุดเริ่มต้นของการขาย