Odoo 13 域过滤问题
Problems with Odoo 13 Domain filtering
我想为 odoo 选择价格。
我在 product.product 上将其设置为 one2many。它仅由一个字段价格类型和一个价格组成。
我想要的是:
choosable price_types should be apple, peach or lemon
- no price selection records created:
-- domain for type_id is apple, peach or lemon
- 1 record created with type apple:
-- domain for record 1: type_id is apple, peach or lemon
-- domain for new record: type_id is peach or lemon
- second record created with typle peach:
-- domain for record 1: type_id is apple or lemon
-- domain for record 2: type_id is peach or lemon
-- domain for new record: type_id is lemon
- third record created with typle lemon:
-- domain for record 1: type_id is apple
-- domain for record 2: type_id is peach
-- domain for record 3: type_id is lemon
-- new record: no further record could be created as no type_id left
我想保留域中每条记录的实际选定值的原因是,如果我从域中删除当前选定的值,odoo 似乎不喜欢
我的价格选择低于class“product_draft_prices”。 price_type 是字段 type_id 并且组合 (type_id, product_id) 必须是唯一的。
是否可以使用域过滤器进行上述过滤?价格类型存储在单独的 table product_draft_pr_types 中,特别是对于域过滤。
所以我想根据记录设置域过滤器。
我认为与此最接近的现有小部件是 many2manywidget。在这里您还可以只选择尚未分配的记录。
产品扩展
class product_product(models.Model):
_inherit = 'product.product'
product_draft_prices = fields.One2many('product.product.draft_prices', 'product_id', string='Produktpreise', copy=True, auto_join=True)
产品价格table
class product_draft_prices(models.Model):
_name = 'product.product.draft_prices'
_description = 'product.product.draft_prices'
_sql_constraints = [('unique_type', 'unique(type_id, product_id)',
'Fehler bei Produktpreisen:\n\nDieser Preistyp ist ' + \
'für dieses Produkt schon vergeben, bitte anderen auswählen')]
product_id = fields.Many2one('product.product', string='Produkt', required=True, copy=False)
type_id = fields.Many2one('product.product.draft_pr_types', required=True, string="Preistyp")
name = fields.Char('Name des Produktpreises')
price = fields.Float('Preiseingabe', required=True, digits='Product Price')
产品价格类型
class product_draft_pr_types(models.Model):
_name = 'product.product.draft_pr_types'
_description = 'product.product.draft_pr_types'
types = ['apple', 'peach', 'melon']
name = fields.Char('Preistyp')
提前致谢
你可以试试this.I不知道到底能不能用。
我希望即使它无法解决,你也可以得到一些参考。
class product_draft_prices(models.Model):
_name = 'product.product.draft_prices'
_description = 'product.product.draft_prices'
_sql_constraints = [('unique_type', 'unique(type_id, product_id)',
'Fehler bei Produktpreisen:\n\nDieser Preistyp ist ' + \
'für dieses Produkt schon vergeben, bitte anderen auswählen')]
product_id = fields.Many2one('product.product', string='Produkt', required=True, copy=False)
type_id = fields.Many2one('product.product.draft_pr_types', required=True, string="Preistyp")
name = fields.Char('Name des Produktpreises')
price = fields.Float('Preiseingabe', required=True, digits='Product Price')
@api.onchange('type_id','product_id.product_draft_prices')
def onchange_type_id(self):
price_list=[]
for plist in self.product_id.product_draft_prices:
price_list.append(plist.type_id.price_type.id)
return {'domain':{'type_id':[('price_type','not in',price_list)]}}
将您的选择字段更改为 many2one。
class product_draft_pr_types(models.Model):
_name = 'product.product.draft_pr_types'
_description = 'product.product.draft_pr_types'
types = field.many2one(product.type,string="Type")
name = fields.Char('Preistyp')
class type(models.Model):
_name = "product.type"
name= field.Char(string="Type name")
所以我的代码现在看起来像这样
class product_draft_prices(models.Model):
_name = 'product.product.draft_prices'
_description = 'product.product.draft_prices'
_sql_constraints = [('unique_type', 'unique(type_id, product_id)',
'Fehler bei Produktpreisen:\n\nDieser Preistyp ist ' + \
'für dieses Produkt schon vergeben, bitte anderen auswählen')]
@api.depends('type_ids','product_id.product_draft_prices')
def _get_type_ids(self):
for record in self:
price_list = []
for plist in record.product_id.product_draft_prices:
if record.type_id and record.type_id.name and record.type_id.name == plist.type_id.name:
continue
price_list.append(plist.type_id.id)
record.type_ids = [(6, 0, price_list)]
product_id = fields.Many2one('product.product', string='Produkt', required=True, copy=False)
type_id = fields.Many2one('product.product.draft_pr_types', required=True, string="Preistyp")
type_ids = fields.Many2many('product.product.draft_pr_types', required=True, string="Preistypen zur Auswahl", store=True, compute=_get_type_ids)
name = fields.Char('Name des Produktpreises')
price = fields.Float('Preiseingabe', required=True, digits='Product Price')
@api.onchange('type_id','product_id.product_draft_prices')
def _onchange_type_id(self):
price_list = []
for plist in self.product_id.product_draft_prices:
if self.type_id and self.type_id.name and self.type_id.name == plist.type_id.name:
continue
price_list.append(plist.type_id.name)
return {'domain': {'type_id': [('name', 'not in', price_list)]}}
和视图的这两行
<field name="type_ids" invisible="1"/>
<field name="type_id" domain="[('id', 'not in', type_ids)]"/>
字段 type_id 的域在运行时被当前选定的值覆盖,因此问题已解决
我想为 odoo 选择价格。
我在 product.product 上将其设置为 one2many。它仅由一个字段价格类型和一个价格组成。
我想要的是:
choosable price_types should be apple, peach or lemon
- no price selection records created:
-- domain for type_id is apple, peach or lemon
- 1 record created with type apple:
-- domain for record 1: type_id is apple, peach or lemon
-- domain for new record: type_id is peach or lemon
- second record created with typle peach:
-- domain for record 1: type_id is apple or lemon
-- domain for record 2: type_id is peach or lemon
-- domain for new record: type_id is lemon
- third record created with typle lemon:
-- domain for record 1: type_id is apple
-- domain for record 2: type_id is peach
-- domain for record 3: type_id is lemon
-- new record: no further record could be created as no type_id left
我想保留域中每条记录的实际选定值的原因是,如果我从域中删除当前选定的值,odoo 似乎不喜欢
我的价格选择低于class“product_draft_prices”。 price_type 是字段 type_id 并且组合 (type_id, product_id) 必须是唯一的。
是否可以使用域过滤器进行上述过滤?价格类型存储在单独的 table product_draft_pr_types 中,特别是对于域过滤。
所以我想根据记录设置域过滤器。
我认为与此最接近的现有小部件是 many2manywidget。在这里您还可以只选择尚未分配的记录。
产品扩展
class product_product(models.Model):
_inherit = 'product.product'
product_draft_prices = fields.One2many('product.product.draft_prices', 'product_id', string='Produktpreise', copy=True, auto_join=True)
产品价格table
class product_draft_prices(models.Model):
_name = 'product.product.draft_prices'
_description = 'product.product.draft_prices'
_sql_constraints = [('unique_type', 'unique(type_id, product_id)',
'Fehler bei Produktpreisen:\n\nDieser Preistyp ist ' + \
'für dieses Produkt schon vergeben, bitte anderen auswählen')]
product_id = fields.Many2one('product.product', string='Produkt', required=True, copy=False)
type_id = fields.Many2one('product.product.draft_pr_types', required=True, string="Preistyp")
name = fields.Char('Name des Produktpreises')
price = fields.Float('Preiseingabe', required=True, digits='Product Price')
产品价格类型
class product_draft_pr_types(models.Model):
_name = 'product.product.draft_pr_types'
_description = 'product.product.draft_pr_types'
types = ['apple', 'peach', 'melon']
name = fields.Char('Preistyp')
提前致谢
你可以试试this.I不知道到底能不能用。 我希望即使它无法解决,你也可以得到一些参考。
class product_draft_prices(models.Model):
_name = 'product.product.draft_prices'
_description = 'product.product.draft_prices'
_sql_constraints = [('unique_type', 'unique(type_id, product_id)',
'Fehler bei Produktpreisen:\n\nDieser Preistyp ist ' + \
'für dieses Produkt schon vergeben, bitte anderen auswählen')]
product_id = fields.Many2one('product.product', string='Produkt', required=True, copy=False)
type_id = fields.Many2one('product.product.draft_pr_types', required=True, string="Preistyp")
name = fields.Char('Name des Produktpreises')
price = fields.Float('Preiseingabe', required=True, digits='Product Price')
@api.onchange('type_id','product_id.product_draft_prices')
def onchange_type_id(self):
price_list=[]
for plist in self.product_id.product_draft_prices:
price_list.append(plist.type_id.price_type.id)
return {'domain':{'type_id':[('price_type','not in',price_list)]}}
将您的选择字段更改为 many2one。
class product_draft_pr_types(models.Model):
_name = 'product.product.draft_pr_types'
_description = 'product.product.draft_pr_types'
types = field.many2one(product.type,string="Type")
name = fields.Char('Preistyp')
class type(models.Model):
_name = "product.type"
name= field.Char(string="Type name")
所以我的代码现在看起来像这样
class product_draft_prices(models.Model):
_name = 'product.product.draft_prices'
_description = 'product.product.draft_prices'
_sql_constraints = [('unique_type', 'unique(type_id, product_id)',
'Fehler bei Produktpreisen:\n\nDieser Preistyp ist ' + \
'für dieses Produkt schon vergeben, bitte anderen auswählen')]
@api.depends('type_ids','product_id.product_draft_prices')
def _get_type_ids(self):
for record in self:
price_list = []
for plist in record.product_id.product_draft_prices:
if record.type_id and record.type_id.name and record.type_id.name == plist.type_id.name:
continue
price_list.append(plist.type_id.id)
record.type_ids = [(6, 0, price_list)]
product_id = fields.Many2one('product.product', string='Produkt', required=True, copy=False)
type_id = fields.Many2one('product.product.draft_pr_types', required=True, string="Preistyp")
type_ids = fields.Many2many('product.product.draft_pr_types', required=True, string="Preistypen zur Auswahl", store=True, compute=_get_type_ids)
name = fields.Char('Name des Produktpreises')
price = fields.Float('Preiseingabe', required=True, digits='Product Price')
@api.onchange('type_id','product_id.product_draft_prices')
def _onchange_type_id(self):
price_list = []
for plist in self.product_id.product_draft_prices:
if self.type_id and self.type_id.name and self.type_id.name == plist.type_id.name:
continue
price_list.append(plist.type_id.name)
return {'domain': {'type_id': [('name', 'not in', price_list)]}}
和视图的这两行
<field name="type_ids" invisible="1"/>
<field name="type_id" domain="[('id', 'not in', type_ids)]"/>
字段 type_id 的域在运行时被当前选定的值覆盖,因此问题已解决