Developer Logs

odoo One2many ninja! work with odoo models like a ninja

odoo
Python

Bite size กับการทำงานกับ One2many fields ใน odoo ที่จะทำให้เราเข้าใจในการเขียน code มากขึ้น

Days: 7 | Publish : 23/02/2025

odoo one2many ninja ! tips and trick to work with one2many
              

วันนี้ขอพามาคุยกันในหัวข้อแบบ Bite size เอาแค่กำลังพอดี เป็นการรวบรวม Quick tips หลาย ๆ สิ่งที่จะต้องเจอ สำหรับการทำงานกับ One2many fields แล้วกันนะครับ ซึ่งในวันนี้จะขออยู่ในการทำงานกับ models side เล่นกับไฟล์ .py ก่อนนะครับ


Work with data

ผมจะไปพาไปไล่ดูกันทีละตัว ว่าเรามี options อะไรบ้าง ในการทำงานกับข้อมูลในเวลาที่เราใช้ fields เป็น One2many


  self.order_line = [(5, 0, [])]

เคยผ่านตากันมาบ้างมั้ยครับ ??? . โค้ดข้างต้นนี้ คือการเคลียร์ข้อมูลใน One2many fields ออกทั้งหมด

. .

แล้วมันมีอะไรอีกบ้างล่ะ ??

(0, 0, { values })
  • เป็นการ add record ใหม่เข้าไปโดยใช้ข้อมูลที่อยู่ใน {values}
  • ตัวอย่าง

  self.order_line = [(0, 0, {
    'order_id': self.id, # self.id = 10
    'quantity': 0,
    'price_unit': 100
  })]
 # result: order_line id = 285 added

(1, ID, { values })
  • update record โดยต้องระบุ id และ values dict ที่ต้องการเปลี่ยนแปลง
  • ตัวอย่าง (สมมติว่าต้องการ update order_line จากข้อก่อนหน้านี้)

  self.order_line = [(1, 285, {
    'quantity': 10
  })]
  # result: order_line (285)
  # quantity 0 => 10

(2, ID)
  • ทำเหมือน action unlink() คือจะเป็นการลบ record id ที่ระบุออกจาก table
  • ตัวอย่าง

  self.order_line = [(2, 285)]
  # result: order_line (285) deleted

(3, ID)
  • เป็นการตัด relationship ออกจากกัน แต่ data จะยังอยู่ แค่ reference ขาดออกจากกัน
  • ตัวอย่าง

  self.order_line = [(3, 286)]
  # result: order_line (286)
  # let say that order_id = 10
  # order_id 10 => None

(4, ID)
  • ทำการ link record ที่ระบุไปตาม parent ที่เรียก
  • ตัวอย่าง

  # let say self.id = 10
  self.order_line = [(4, 286)]
  # result: order_line (286) link to order_id = 10

(5, 0, []) or (5)
  • Unlink all records เป็นการลบ records ทิ้งทั้งหมด ที่ ref ถึง parent
  • ตัวอย่าง

  # let say order_line id = 285, 286
  self.order_line = [(5, 0, [])]
  # self.order_line = [(5)]
  # result: order_line (285, 286) deleted

(6, 0, [IDs])
  • จะเป็นการ unlink พร้อมกับ link records ทั้งหมดใน step เดียวกัน
  • หรือถ้าไล่ step จะคล้ายกับการทำ (5) —> unlink all แล้วตาม (4, ID) link ID เข้าไปใหม่ ตามที่ลิสทั้งหมดใน [IDs]
  • ตัวอย่าง

  # product = product object
  self.order_line.tax_ids = [(6, 0, product.taxes_id.ids)]


สรุป

  • ทั้งหมดที่สามารถใช้งานได้

  (0, 0,  { values })
  (1, ID, { values })
  (2, ID)
  (3, ID)
  (4, ID)
  (5) or (5, 0, [])
  (6, 0, [IDs])

ก็หวังว่าจะทำให้เข้าใจการทำงานกับ One2many กันมากขึ้น และช่วยให้มีทางเลือกในการ coding มากขึ้นนะครับ ใน devlogs ครั้งหน้า เราจะมาต่อ One2many ninja กับฝั่งหน้า view กันบ้าง

แล้วเจอกันครับ!

>_JV