Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

关于domain,如何跨类比较?



  • 比如有一个包含字段A1的A类,包含字段B1,B2的B类,其中B2为many2one A
    在domain中如何比较B1和A1的值?
    具体比如当新建B的时候,我希望先填写B1,然后根据B1的值过滤筛选一部分B2的可选条目



  • onchange 回掉里动态改domain



  • @BraidTim
    以下方式也行:
    <field name="B2" domain="[('B1', 'operator', parent.A1)]"/>

    搜索域中的每个元组需要有3个元素,格式为:('field_name','operator',value),其中:
    (1) field_name必须是对象模型的字段的有效名称,可使用点符号进行many2one关系,例如“partner_id.country”是有效值。
    (2) 运算符必须是一个带有有效比较运算符的字符串:=,!=,>,> =,<,<=,like,ilike,in,not in,child_of
    (3) 值必须是与field_name的值进行比较的有效值,具体取决于其类型



  • @Felix_Cheng
    field name="B2" domain="[('B1', 'operator', parent.A1)]"
    似乎在many2one里面使用domain,字段名字直接就是A里面的名字
    我这儿是odoo10,field name="B2" domain="[('A1', 'operator', value)]"这样写就能运行,但是类似上面那样写
    field name="B2" domain="[('B1', '=', 1)]"
    直接就显示
    ValueError: Invalid field u'B1' in leaf "<osv.ExtendedLeaf: (u'B1', u'=', 1) on meeu_v1_warehouse_product_manage (ctx: )>"
    顺便问问value是不需要引号的吗?



  • @Siyuan
    能给个简单的例子或者什么模块里有现成的让我学学么?我看教程只有个onchange弹出提示的简单例子,还不知道怎么动态改view的内容。。。谢谢



  • @BraidTim 更正一下上贴,搞反了,不好意思:<field name="B2" domain="[('A1', 'operator', B1)]"/>, value是number类型直接写值不加引号,布尔型False或True,String类型加上引号。具体看数据类型,的确是不太容易的。
    如:
    domain="[('state','=','done')]"
    domain="[('user_id','=',uid)]"
    domain="[('user_id','=',False)]"
    domain="[('reconcile_id','=', False), ('credit', '>',0),('amount_to_pay','>',0)] "
    代码生成如下:
    class Test_b(models.Model):
        _name='test.b'
        _b1=fields.Integer(string='B1')
        _b2=fields.Many2one('test.a', string='B2')

    class Test_a(models.Model):]
        _name='test.a'
        _a1=fields.Integer(string='A1')

    XML
    <record id='test_b_form' model='ir.ui.view'>
         xxxxxx....
         yyyyyy...
         <form ....>
            <field name="b1" />
            <field name="b2" domain="[('a1', '&lt;', b1)]"
        </form>
    其中a1为父表(Many2one)字段,b1为本表字段。在父表筛选记录,该记录的a1字段值比b1的value小
    openerp7.0 在domain写'>'是允许的,但是高版本要写转义'&lt;'



  • @BraidTim

    例如 account 下面 account_invoice.py

    @api.onchange('product_id')
    def _onchange_product_id(self):
        domain = {}
    ......
        return {'domain': domain}
    

    动态修改了product_id 的domain



  • @felix_cheng
    谢谢,换过来就对了。本类里面的字段也不用引号是吧?之前我可能加了引号,系统当字符串处理所以还是不行。
    也就是说字段和数字,bool都不用加引号,字符串需要加引号这样?
    对比的时候数据类型会自动转换么?比如如果我想比较date这种,看起来是字符串但是有大小之分的。还是要专门写函数什么的?



  • @braidtim
    关于date可以写成
    <field name="domain">[('from_date', '&lt;', '2017-08-01')]
    是没有问题的,domain将转换成SQL的Where, 换句话说上面的domain在底层数据库翻译为
    SELECT * FROM table_xxx WHERE from_date < '2017-08-01', (这个可以通过的

    也可以从另外角度来看:如,
    <field name="domain">[('from_date', '&lt;', 'First date to school')],
    SQL为:
    SELECT * FROM table_xxx WHERE from_date < 'First date to school', 这明显类型不兼容

    结论:domain比较类型兼不兼容, 想想看SQL通不通过就可以验证。
    --(3) 值必须是与field_name的值进行比较的有效值,具体取决于其类型(这个是我在上面贴里提到的

    至于其他数字类型的如Integer,Float,Boolean应该可以在一定程度上互相比较,有兴趣的话你可以自己
    试试。



  • @felix_cheng
    先多谢细心指导
    我在另一个帖子也看到您关于domain的解答,那个帖子问的是直接写在many2one定义里面的domain。我想请问问domain直接在定义字段的时候写和在view中写有什么有略,两种分别有什么适用场景?


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待