我被要求在Odoo中为附件开发标签系统。
对于我发现this standard module(称为文档管理系统)的附件,我没有找到任何对标记管理有用的内容。
因此,我开发了自己的自定义模块,其中附件(由核心ir.attachment
模型表示)已经扩展为具有tag
模型的Many2many关系,而后者又代表。 ..标记,并有一个tag
字段,表示实际标记的文本内容。
然后我一直在用标签搜索......
Odoo搜索视图基于A OP B
表达式,其中A
是模型的字段,OP
是运算符(例如=
)和B
(通常)是搜索的术语(但它可以是任何Python表达式)。
这里的问题是搜索的术语必须与相关对象的字段(即标签)进行比较,不与附件本身的字段进行比较。< / p>
所以我想出了一个解决方法。我用附件扩展了附件模型:
tags
的计算字段字段,其中包含关联的自定义搜索方法_search_tags
found_by_tag
_search_tags
,其作用是根据搜索的术语将标记found_by_tag
设置为正确的值。
因此,搜索视图的表达式变为[('found_by_tag', '=', True)]
。
这是Python代码中的相关部分:
# Attachments
class attachment(models.Model):
_inherit = 'ir.attachment'
# Tag management
tag_ids = fields.Many2many('attachmentssample.tag', string = 'Tags')
tags = fields.Text(compute = '_compute_tags', search = '_search_tags')
found_by_tag = fields.Boolean()
@api.one
@api.depends('tag_ids')
def _compute_tags(self):
tags = ''
for tag in self.tag_ids:
tags += tag.tag + ','
self.tags = tags
def _search_tags(self, operator, value):
attachments = self.search([])
for attachment in attachments:
attachment.checkIfRelevantFor(value)
return [('found_by_tag', '=', True)]
def checkIfRelevantFor(self, search_tag):
relevant = False
for tag in self.tag_ids:
if tag.tag == search_tag:
relevant = True
if relevant:
self.found_by_tag = True
else:
self.found_by_tag = False
# Tags
class tag(models.Model):
_name = 'attachmentssample.tag'
tag = fields.Char()
虽然解决方法确实有效,但我想知道这是否过多。有没有更简单的方法来实现标签搜索?或者,是否有可用于此目的的模块?
答案 0 :(得分:0)
不确定社区上是否存在此模块,
但是从理想的odoo实施指南来看,你所做的事情是完全正确的。如果您认为要提升css样式和可重用性因素,则需要使用额外的标签模型。您将在v9中看到这些内容已经完成
第二个想法,如果您认为这些标签只是提供信息,那么您可以只创建文本字段并存储逗号分隔的值,并且您的帮助方法可以通过逗号轻松拆分或连接。为什么这个想法。因为这会大大减少db IO标签evrytime你读取附件和ir.attachment链接到所有模型记录的事实,所有想法消除表对性能都很好,因为python代码比db IO快。
Bests
答案 1 :(得分:0)
我提出了最好的可能解决方案。在书Odoo Development Essentials中,解释了当左侧是&#34; to-many&#34;时,域表达式中的'in'
运算符的行为会有所不同。领域。在这种情况下,('A', 'in', B)
的语义变为&#34;如果B是A&#34;所引用的记录的ID之一,则将记录保留为ID B.换句话说,应该反过来阅读表达式。有了这些知识,您可以按标签分两步执行搜索:
('attachment_ids', 'in', id)
等域名表达中使用其ID。使用此策略,您不需要其他字段来支持搜索。
(男人...... Odoo的发展是......具有挑战性)