Many2one 与 inherit 区别
- qc_category.py中定义模型
from openerp import models, fields, api, exceptions
class QcCategory(models.Model):
_name = ‘qc.category’
_description = ‘Qc Category’
name = fields.Char(‘Name’, required=True, translate=True)
- qc_guangdian.py中调用Many2one
class QcGuangdianShouhou(models.Model):
_name = 'qc.guangdian.shouhou'
_description = 'Guangdian shouhou'
_inherit = ['mail.thread', 'ir.needaction_mixin']
parent_id = fields.Many2one(
comodel_name='qc.category', string='不良明细', select=True)
一个表中的一个参数被反复引用,那么可以单独做成many2one 独立做成一个表单
Inherit为继承另一个表单中的参数
重点:
-
在__manifest__.py中找到depends,加上要继承的模块
-
ir.actions.act_window,menu要放ir.ui.view下
-
field name="inherit_id"类中 下面内容不能为空,可以直接应用视图,去掉。
-
继承部分代码
<record id="product_template_only_form_view" model="ir.ui.view"> <field name="name">product.template.product.form</field> <field name="model">product.template</field> <field name="mode">primary</field> <field name="priority" eval="8" /> <field name="inherit_id ref="product.product_template_form_view"/> <field name="arch" type="xml"> <record id="product_template_form_view" model="ir.ui.view"> <field name="name">product.template.common.form</field> <field name="model">product.template</field> <field name="mode">prima
Ir_ui_view中
Ir_act_windows中
Ir_ui_menu中
<record id="product_template_action" model="ir.actions.act_window">
<field name="name">Products</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">product.template</field>
<field name="view_mode">tree,form,kanban</field>
<field name="view_type">form</field>
<field name="view_id" ref="product_template_tree_view"/>
<field name="context">{"search_default_filter_to_sell":1}</field>
</record>
二.
1.Quality_category/models/product_category.py中
from openerp import models, fields
class ProductCategory(models.Model):
_inherit = "product.category"
qc_triggers = fields.One2many(
comodel_name="qc.trigger.product_category_line",
inverse_name="product_category",
string="Quality control triggers")
2.Product/product.py中
class product_category(osv.osv):
_name = "product.category"
_description = "Product Category"
_columns = {
'name': fields.char('Name', required=True, translate=True, select=True),
'complete_name': fields.function(_name_get_fnc, type="char", string='Name'),
'parent_id': fields.many2one('product.category','Parent Category', select=True, ondelete='cascade'),
'child_id': fields.one2many('product.category', 'parent_id', string='Child Categories'),
'sequence': fields.integer('Sequence', select=True, help="Gives the sequence order when displaying a list of product categories."),
'type': fields.selection([('view','View'), ('normal','Normal')], 'Category Type', help="A category of the view type is a virtual category that can be used as the parent of another category to create a hierarchical structure."),
'parent_left': fields.integer('Left Parent', select=1),
'parent_right': fields.integer('Right Parent', select=1),
}
3.qc_trigger_line.py中 qc.trigger.product_category_line
class QcTriggerProductCategoryLine(models.Model):
_inherit = "qc.trigger.line"
_name = "qc.trigger.product_category_line"
product_category = fields.Many2one(comodel_name="product.category")
def get_trigger_line_for_product(self, trigger, product, partner=False):
trigger_lines = super(
QcTriggerProductCategoryLine,
self).get_trigger_line_for_product(trigger, product,
partner=partner)
category = product.categ_id
while category:
for trigger_line in category.qc_triggers.filtered(
lambda r: r.trigger == trigger and (
not r.partners or not partner or
partner.commercial_partner_id in r.partners)):
trigger_lines.add(trigger_line)
category = category.parent_id
return trigger_lines
from openerp import models, fields
class QcTriggerLine(models.AbstractModel):
_name = "qc.trigger.line"
_description = "Abstract line for defining triggers"
trigger = fields.Many2one(comodel_name="qc.trigger", required=True)
test = fields.Many2one(comodel_name="qc.test", required=True)
user = fields.Many2one(
comodel_name='res.users', string='Responsible',
track_visibility='always', default=lambda self: self.env.user)
partners = fields.Many2many(
comodel_name='res.partner', string='Partners',
help='If filled, the test will only be created when the action is done'
' for one of the specified partners. If empty, the test will always be'
' created.', domain="[('parent_id', '=', False)]")
def get_trigger_line_for_product(self, trigger, product, partner=False):
"""Overridable method for getting trigger_line associated to a product.
Each inherited model will complete this module to make the search by
product, template or category.
:param trigger: Trigger instance.
:param product: Product instance.
:return: Set of trigger_lines that matches to the given product and
trigger.
"""
return set()
4.qc_trigger.py中
class QcTrigger(models.Model):
_name = 'qc.trigger'
_description = 'Quality control trigger'
name = fields.Char(string='Name', required=True, select=True,
translate=True)
active = fields.Boolean(string='Active', default=True)
company_id = fields.Many2one(
comodel_name='res.company', string='Company',
default=lambda self: self.env['res.company']._company_default_get(
'qc.test'))
partner_selectable = fields.Boolean(
string='Selectable by partner', default=False, readonly=True,
help='This technical field is to allow to filter by partner in'
' triggers')