这里显示我的错误
2013-04-23 05:36:03,877 17001 ERROR demo openerp.sql_db: bad query: SELECT "res_company".id FROM "res_company" WHERE "res_company".id = 'deduction_id.bpl_company_id.id' ORDER BY "res_company"."name"
Traceback (most recent call last):
File "/home/bellvantage/Documents/openerp-7.0/openerp-7/openerp/sql_db.py", line 226, in execute
res = self._obj.execute(query, params)
DataError: invalid input syntax for integer: "deduction_id.bpl_company_id.id"
LINE 1: ...y".id FROM "res_company" WHERE "res_company".id = 'deduction...
^
2013-04-23 05:36:03,878 17001 ERROR demo openerp.osv.osv: Uncaught exception
Traceback (most recent call last):
这里显示了我尝试添加域过滤器的代码
class estate_bank_deductions(osv.osv):
_name = 'bpl.estate.bank.deductions'
_description = 'Estate Bank Deductions'
_columns = {
'deduction_id':fields.many2one('bpl.deduction.estate.data', 'Bank Deductions', ondelete='cascade'),
'name': fields.many2one('bpl.deduction.registration', 'Deduction', domain="[('type','=','bank'),('bpl_company_id.id','=','deduction_id.bpl_company_id.id')]"),
'bank_id': fields.many2one('bpl.bank.registration', 'Bank Name'),
'branch_id': fields.many2one('bpl.branch.registration', 'Branch'),
}
这是我父母一类的房地产银行扣除类
_name = 'bpl.deduction.estate.data'
_description = 'BPL Deduction Estate Data'
_columns = {
'bpl_company_id':fields.many2one('res.company', 'Company', help='Company'),
请帮我解决这个问题。? 我的域名过滤机制中是否有任何遗漏或者这种方式不正确。?
亲爱的odony,
还有一件事需要澄清,
现在需要将我的字段定义为fields.function
?
但问题是在添加域过滤器之后还将其他不相关的记录也加载到我的下拉列表中(在我添加了widget =“selection”属性之后)。 然后如何限制它们。 i already posted that issue
希望你能就此提出建议......再次感谢你......
答案 0 :(得分:8)
无论如何都无济于事。模型字段仅支持两种域过滤器:
服务器端(列表)域,指定为元组列表:只能是静态的,并且可用于one2many
和many2many
大多数领域。当读取字段的值列表时,这些过滤器将应用于服务器端,并且永远不会在客户端使用。域只能包含每个域元素右侧的常量。有效的服务器端域的示例是:
# filter deductions based on an imaginary "confirmed" boolean field
deduction_ids = fields.one2many('bpl.estate.bank.deductions', 'bank_id',
string="Confirmed Deductions",
domain=[('confirmed', '=', True)])
客户端(字符串)域,指定为服务器端域的字符串表示:可以是静态的也可以是动态的,并且是主要用于many2one
字段,从不在服务器端进行评估。它们只是在使用该字段的任何视图中复制,并在客户端进行解释,以过滤该字段的可用选项列表。通过引用视图中包含的任何其他字段的名称,可以使每个域元素的右侧动态化,并在评估域时将其替换为字段值。字段值将以与保存更改时传递给write()
的格式相同的格式返回。有效客户端域的示例是:
# only allow choosing a branch that belongs to the right bank registration
# (here `branch_id` refers to the current value of the `branch_id` field
# in the form view
'branch_id': fields.many2one('bpl.branch.registration', 'Branch',
domain="[('branch_id','=',branch_id)]")
更新注意,您不能将widget="selection"
与客户端域结合使用,因为此选项会将您的many2one
字段转换为假的fields.selection
,选项是服务器端静态评估的。在这种情况下,您的客户端域将被忽略,可用值列表将永远不会更改。现在,如果您只是想避免用户创建新值,您可以限制访问权限以防止这种情况,如果您想避免显示查看/编辑目标对象的图标,可以将options='{"no_open": True}'
添加到表单中的字段图。
在您的情况下,您似乎希望使用客户端域根据deduction_id
字段的当前值进行过滤。但您的域名表达式('bpl_company_id.id','=','deduction_id.bpl_company_id.id')
不正确:
.id
后缀无用,bpl_company_id
足以过滤many2one
字段。'deduction_id.bpl_company_id.id'
,那么您将m2o
ID(或m2o
名称,如果删除.id
后缀)与文字字符串值{{ 1}},当然不是你想要的
如果您按照user2310008的建议删除引号,您将确实使其成为动态,但"deduction_id.bpl_company_id.id"
的值将是所选“扣除”的ID!您不能像服务器端那样将它视为deduction_id
(类似ActiveRecord的对象),因此当您执行browse_record
时,您将收到错误,因为整数没有"deduction_id.bpl_company_id.id"
属性实现此类过滤的常用方法是在bpl_company_id
字段上添加on_change
方法,并使用它来动态更改deduction_id
列的域,通过name
方法可以返回的domain
密钥。像这样:
onchange
<!-- in the XML view -->
<field name="deduction_id" on_change="onchange_deduction_id(deduction_id)"/>
<field name="name"/>
答案 1 :(得分:1)
试试这个。
('bpl_company_id','=',deduction_id.bpl_company_id.id)
没有引号第二部分,并且该字段不能递归地完成。