odoo ORM研究3 - odoo fields常用的欄位屬性

FANDX發表於2021-07-22

之前我們已經講解了odoo ORM中的一些對欄位常用的API操作方法,今天我們繼續研究一下Odoo orm中欄位的一些通用屬性欄位的使用,學會它們可以為自己建立資料對映並使用有更好的幫助。

通用欄位屬性

例項化對映模型的時候時可以使用以下屬性

  • string(str)

    • xml檢視在渲染的時候會顯示這個值的內容。
    • fandx_name = fields.Char(string="姓名")
  • help(str)

    • 幫助文字,滑鼠放到對應欄位上面會出現help的描述內容。
    • fandx_name = fields.Char(help="這是一個姓名")
  • readonly(bool)

    • 是否是隻讀,只讀則不可以修改欄位的內容,在檢視中不可以修改對應欄位的內容。
    • fand_name = fields.Char(string="姓名", readonly=True)
  • required(bool)

    • 是否必填,如果required為True,那麼這個字在XML檢視顯示的時候不填則儲存的時候會報錯。
    • fandx_name = fields.Char(string="姓名", readonly=True, required=True)
  • index(bool)

    • 是否在資料庫建立索引,加上索引的欄位在搜尋的時候會有速度的提升。
    • fandx_name = fields.Char(string="姓名", readonly=True, required=True, index=True)
  • default(value 或者 callable)

    • default可以設定這個欄位的預設值。

    • default的內容可以是固定的預設值。

    • default也可以是一個被呼叫的function,default的值會自動設定為function的返回值。

    • 方式一:fandx_name = fields.Char(string="姓名", default="張三")

    • 方式二:fandx_name = fields.Char(string="姓名", default=lambda self: self.env.user.display_name)

    • 方式三:

      def _defult_name(self):
        return self.env.user.display_name
      fandx_name = fields.Char(string="姓名", invisible=True, default=_defult_name)
      
  • states(bool)

    • 這個可以根據state狀態的的值動態改變欄位在XML中的顯示狀態。

    • 必須配合state狀態欄位使用。

      model.py

      state = fields.Selection([('create', '建立'), ('finish', '已完成')], string='狀態', default='create')
      fandx_test = fields.Char("測試欄位", states={'create': [('required', True)], 'finish': [('readonly', True)]})
      

      View.xml

      <field name="state" />
      <field name="fandx_test" />
      
    • 注意:!!!用到這個方法必須要在xml檢視中載入state欄位,如果不載入則會報JS錯誤。

  • groups(str)

    • 許可權組,odoo中可以去配置自己的許可權組,可以給指定的欄位賦予許可權組,這個欄位會根據許可權組的內容設定進行限制增刪改查許可權。
    • fandx_name = fields.Char(string="姓名", default="張三", groups='base.group_user')
  • company_dependent(bool)

    • 這個欄位如果為True的話,這個欄位的資料值會根據登入的使用者的公司進行繫結,可以實現不同使用者不同欄位內容顯示。
    • fandx_name = fields.Char(string="姓名", company_dependent=True)
  • copy(bool)

    • odoo有自帶的模型快速複製的功能,這個如果copy的值為False那麼就不會被複制,這個值預設值為True,one2many欄位和計算欄位是預設為Fasle的。
    • fandx_name = fields.Char(string="姓名", company_dependent=True, copy=False)
  • store(bool)

    • 是否儲存到資料庫中,預設值為True,compute計算欄位預設值為False。
    • fandx_name = fields.Char(string="姓名", store=False)
  • group_operator(str)

    • 這裡的str內容是固定的選擇,在搜尋分組的時候計算欄位的值會用到這個group_operator的內容。

      • count - 計算數量。

      • count_distinct - 資料不同的數量。

      • bool_and - 如果所有值都為true,則為true,否則為false。

      • bool_or - true if at least one value is true, otherwise false。

      • max - 最大值。

      • min - 最小值。

      • avg - 平均值。

      • sum - 求和。

        image

    • fandx_nums = fields.Integer(string="a_test", group_operator='sum')

  • group_expand(str)

    • 這裡傳進一個方法名稱,在分組的時候會進行呼叫這個方法。

      state = fields.Selection([('create', '建立'), ('finish', '已完成')], string='狀態', default='create', group_expand="_expand_states")
      
      def _expand_states(self, states, domain, order):
        # 這裡返回需要成組的欄位,如果按state分組就會走到這個方法!
      	return [key for key, val in type(self).state.selection]
      

總結

  • 通用屬性在建立欄位的時候是經常會用到的,我們需要靈活的使用它們。
  • 還有compute計算屬性,這裡就先不做解釋,後面單獨去講解它。
  • 如果有問題請在下方留言討論或者聯絡我W:fandx_

相關文章