ODOO13 開發教程四 模型中的字段

在這篇文章中,我將整理出odoo中不同類型的字段及其它們的使用。在開始之前,我必須再給大家講講蛋撻王子的故事。

在上節中,小程序猿爲蛋撻王子做了一個圖書管理的模塊,並進行了安裝測試。但很明顯,模塊太簡單了,並不是蛋撻王子想要的。小程序猿表示,不要着急,剛纔新建並安裝的模塊只是爲了檢查是否能能夠安裝。接下來,就是往模塊裏面填充內容了。蛋撻王子說,我要管理的圖書,必須得有書名,有作者,有出版社,出版時間...

蛋撻王子還沒說完,小程序猿表示,懂,都懂。蛋撻王子的繼母那麼狠毒,一定會用很多問題來刁難蛋撻王子的。小程序猿說,我會把常用的信息,都給你填充到模塊裏去的,包括每本圖書放到哪個書架上。說罷,小程序猿扶了下眼鏡,又是一頓操作。


zerone_book.py文件中,爲圖書增加更多字段:

from odoo import api, fields, models, _


class ZeroneBook(models.Model):
    _name = "zerone.book"
    _description = "Zerone Books"

    _inherit = ['image.mixin']

    image_1920 = fields.Image(string="圖書樣例")
    name = fields.Char(string="圖書名稱", required=True)
    code = fields.Char(string="圖書編號", copy=False, help="管理編號,用於快速定位圖書")
    isbn = fields.Char(string="ISBN", copy=False)
    author = fields.Char(string="作者")
    pages = fields.Integer(string="頁數")
    publish_date = fields.Date(string="出版時間")
    publisher = fields.Char(string="出版社")
    price = fields.Float(string="定價", digits=(7, 2))
    description = fields.Text(string="內容簡介", help="""向借閱者描述本書的內容""")
    binding_type = fields.Selection(
        [("common", "普通"), ("hardcover", "精裝")],
        string="裝幀類型", index=True, default='common'
    )
    e_link = fields.Html(string="電子版連接")
    borrowed = fields.Boolean(string="是否被借閱", default=False)
    date_last_borrowed = fields.Datetime("最後被借閱時間", index=True, readonly=True)

    shelf_id = fields.Many2one('zerone.shelf', string='所在書架')
    tags_ids = fields.Many2many("zerone.tags", string="標籤")

    @api.depends('isbn', 'name')
    def name_get(self):
        result = []
        for book in self:
            result.append((book.id, '%s(%s)' % (book.name, book.isbn)))
        return result

在上面的文件中,小程序猿爲圖書模型,增加了各種類型的字段。用來存儲不同類型的信息,在視圖中,展示的效果也是不同的。

在本章中,小程序猿不僅爲圖書模型豐富了多種字段,還增加了標籤和書架連個模型,並以此演示了關係字段的使用。

書架模型 zerone_shelf.py 

from odoo import api, fields, models, _


class ZeroneShelf(models.Model):
    _name = "zerone.shelf"
    _description = "Zerone Shelf"

    name = fields.Char("書架名稱")
    capacity = fields.Integer("書架容量")
    capacity_rate = fields.Float(string="圖書放置比", compute="_compute_rate")

    book_ids = fields.One2many('zerone.book', 'shelf_id', string="圖書")

    @api.depends('capacity', 'book_ids')
    def _compute_rate(self):
        for record in self:
            if not record.capacity:
                record.capacity_rate = 0.0
            else:
                record.capacity_rate = 100.0 * len(record.book_ids) / record.capacity

標籤模型 zerone_tags.py

from odoo import api, fields, models, _


class ZeroneTags(models.Model):
    _name = "zerone.tags"
    _description = "Zerone Tags"

    name = fields.Char("標籤名稱", size=10)

 創建模型後,在views文件夾下創建視圖文件,創建方法和創建步驟在ODOO13 開發教程三 開始你的第一個模塊 中說過。

注意:

  1. 在創建了新的模型後,不要忘了在models文件夾下的__init__.py中引用。
  2. 不要忘了security文件夾下的ir.model.access.csv 文件中,爲其分配基本的權限。
  3. 在創建完視圖文件後,不要忘記在__manifest__.py 文件中,爲data鍵 增加xml 的引用。

三個不要忘記,能保證你在重啓服務,升級模塊後,能夠看到你的改動效果。 


不同字段在視圖中效果展示 

在簡單字段中,Image 類型的字段這裏特別說明一下,在使用該字段時,需要在當前模型中,繼承  image.mixin ,用來處理圖片的顯示,如果不繼承 image.mixin ,你將不能保存圖片,更無法顯示到視圖。

_inherit = ['image.mixin']

我們主要圍繞圖書、標籤、書架,說一下Many2one、Many2many和One2many 的使用。

Many2one 和 One2many

 這兩個字段類型,通常一起使用,遙相呼應。拿本章的例子說明一下:

class ZeroneBook(models.Model):
    _name = "zerone.book"
    ... ...
    shelf_id = fields.Many2one('zerone.shelf', string='所在書架')

class ZeroneShelf(models.Model):
    _name = "zerone.shelf"
    ... ...
    book_ids = fields.One2many('zerone.book', 'shelf_id', string="圖書")

在 圖書模型 中,我們有Many2one字段 對應到 書架模型, zerone.book  Many2one  zerone.shelf ,

在 書架模型 中,我們有One2many字段 對應到 圖書模型,zerone.shelf One2many  zerone.book

可以這麼讀:

zerone.book  Many2one  zerone.shelf   一本書只能在一個書架。

zerone.shelf One2many  zerone.book  一個書架能放下多本書。

附 ODOO Many2one ondelete屬性

在最最古老的版本中,有一個字段是 One2one 類型的,但在之後版本中移除了。我們沒必要再去討論它的用法了。

Many2many  

這個字段表示,雙向多重關係,一側的任何記錄都可以與另一側的任何數量的記錄相關。

class ZeroneBook(models.Model):
    _name = "zerone.book"
    ... ...
    tags_ids = fields.Many2many("zerone.tags", string="標籤")

class ZeroneTags(models.Model):
    _name = "zerone.tags"
    ... ...
    name = fields.Char("標籤名稱", size=10)

拿本例來說,一本書可以有多個標籤,一個標籤可以被多本書使用。

對於關係字段,可以使用 . 方便的獲取關聯數據,比如:

# 拿到某本圖書
book_res = self.search([("name","=","手摸手Odoo開發教程")],limit=1)
# 通過. 獲取關聯書架的名稱
print(book_res.shelf_id.name)

# 通過. 獲取這本書關聯了哪些標籤
for tag in book_res.tags_ids:
    print(tag.name) 

字段部分,最難理解的部分,大概就是關係字段了。在剛開始用的時候,先想好主從表之間的關係,再決定使用什麼類型字段。多寫,就熟練了。更多關於字段的使用及注意事項,請點這裏

GITHUB  蛋撻和他的噩夢
本節代碼:https://download.csdn.net/download/tsoTeo/12062666

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章