这里显示我的错误
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'),
请帮我解决这个问题。? 我的域过滤机制中是否缺少任何内容,或者这种方式不正确。?
亲爱的奥多尼,
还有一点要澄清,
现在需要将我的字段定义为 fields.function
?
但问题是在添加域过滤器之后,其他不相关的记录也加载到我的下拉列表中(在我添加了 widget="selection"属性之后)。 那么如何限制他们。 i already posted that issue
希望你能给我一些建议......再次非常感谢你
最佳答案
这两种方式都行不通。模型字段仅支持两种域过滤器:
服务器端(列表)域,指定为元组列表:只能是静态的并且用于
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
大部分字段,并且从未在服务器端进行过评估。它们被简单地复制到使用该字段的任何 View 中,并在客户端进行解释以过滤该字段的可用选项列表。通过引用 View 中包含的任何其他字段的名称,可以使每个域元素的右侧动态化,并且在评估域时将替换为字段值。字段值将以传递给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
field 变成一个假的fields.selection
,其选项在服务器端静态评估。在这种情况下,您的客户端域将被忽略,并且可用值列表永远不会改变。现在,如果你只是想避免用户创建新值,你可以限制访问权限来防止这种情况发生,如果你想避免显示图标来查看/编辑目标对象,你可以添加options='{"no_open": True}'
到表单 View 中的字段。
问题
在您的情况下,您似乎想使用客户端域根据 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
后缀)到文字字符串值"deduction_id.bpl_company_id.id"
,肯定不是你想要的。
如果您按照 user2310008 的建议删除引号,您确实会使其动态化,但deduction_id
的值将是所选“扣除”的 ID!您不能像在服务器端那样将其视为browse_record
(类似 ActiveRecord 的对象),因此当您执行"deduction_id.bpl_company_id.id"
时,您会得到一个错误,因为整数没有bpl_company_id
属性。
解决方案
实现这种过滤的通常方法是添加一个on_change
。 deduction_id
字段上的方法,并使用它通过 onchange< 的
方法可以返回。像这样:domain
键动态更改 name
列的域
<!-- in the XML view -->
<field name="deduction_id" on_change="onchange_deduction_id(deduction_id)"/>
<field name="name"/>
# in the python model
def onchange_deduction_id(self, cr, uid, ids, deduction_id, context=None):
if deduction_id:
deduction = self.pool['bpl.deduction.estate.data'].browse(cr, uid,
deduction_id,
context)
return {'domain': {'name': [('bpl_company_id', '=',
deduction.bpl_company_id.id)]}
return {} # or perhaps a default domain?
关于python - OpenERP 7 : relational fields in client-side domain filters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16161840/