在這篇文章中,我將整理出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 開發教程三 開始你的第一個模塊 中說過。
注意:
- 在創建了新的模型後,不要忘了在models文件夾下的__init__.py中引用。
- 不要忘了security文件夾下的ir.model.access.csv 文件中,爲其分配基本的權限。
- 在創建完視圖文件後,不要忘記在__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 一個書架能放下多本書。
在最最古老的版本中,有一個字段是 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