自我和Many2oe字段的Odoo12ce域问题

问题描述

我目前正在开发odoo12ce模块,该模块必须包含一个带有狗登记簿的表以及它的狗的父母(类似于纯种)。在“ father_code”字段中,我只想获取公狗和住在同一城市的狗。

get_domain_male(self):
  return [('gender','=','male'),('city',self.city)]

father_code = fields.Many2one('asc.dog',string="Fathers code",domain = get_domain_male)

asc.dog是相同的模型,这意味着该模型是自动引用的。

运行代码段时,已经设置了城市,并且该字段未显示任何内容,因为未按预期识别自己。当我打印它时,它只是False,并且代码在我进入表单视图之前运行。

代码有什么问题,还有另一种过滤方法? 预先感谢您的帮助。

解决方法

来自Odoo documentation

domain –在客户端上的候选值上设置的可选域 侧面(域或字符串)

因此,基本上,您可以将domain设置为字符串或元组列表,在这种情况下,您可以使用字符串设置域,

father_code = fields.Many2one('asc.dog',string="Fathers code",domain ="[('gender','=','male'),('city',city)]")

因此它将从客户端或视图获取城市价值,并相应地过滤asc.dog记录。当然,要从客户端获取值,视图中必须存在city字段,否则它将在field not found in the view中产生错误。

(可选)您也可以在视图定义中设置域,而不是在字段定义中设置domain

<field name='city' />
<field name='father_code' domain="[('gender',city)]" />

唯一的区别是,如果您在字段定义中执行此操作,则每个由father_code组成的视图将始终自动设置此域,但是您必须包括city(可见或不可见)。

,

在这里,我们使用一个onchange字段,以便每当更改父字段时,狗字段都会被过滤。

循环浏览记录以避免单例和相关问题几乎总是很重要。

@ api.onchange('father_code')
    def _onchange_father_code_filter_dog(self):
        for rec in self:
            return {'domain':
                    {'dog_field': [('gender',rec.city)]}}