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

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

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

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

[已解决]属性relation,column1,column2



  • 如下图:在自己跟自己建立多对多的关系的时候,其中relation是关系表的意思(但是在数据库中找不到啊),属性column1,column2是不是不局限于两个字段,如果我有3个,是不是还可以写column3?

    old_spare_part_ids = fields.Many2many('product.template', string="Old Spare Parts", store=False,relation='product_template_product_template_rel', column1='product_id1',column2='product_id2',compute="_get_old_part_list", readonly=True)
    
        @api.one
        @api.depends('write_date', 'new_spare_part1_id', 'new_spare_part2_id', 'new_spare_part3_id')
        def _get_old_part_list(self):
            old_part_ids = self.env[self._inherit].search(
                ['|', '|', ('new_spare_part1_id', '=', self.id), ('new_spare_part2_id', '=', self.id),
                 ('new_spare_part3_id', '=', self.id)])
            self.old_spare_part_ids = False
            if old_part_ids:
                # print old_part_ids
                self.old_spare_part_ids = [(6, 0, old_part_ids.ids)]
    


  • many2many 关系是通过中间表关联的,

    中间表只有两列,分别是A表的id 和 B表的id,

    relation 对应了中间表的表名,

    如果你不赋值,默认是将两列列名拼起来加上rel后缀,

    但在列名过长的情况下可能会触发postgres 表名过长的问题,

    导致中间表不能生成,

    (postgres 表名不能超过64),

    column1,column2, 你不赋值,默认模型名_id,


    many2many 中间表不存在第三列,

    中间表是个两张表的互相映射关系。


    除非你有业务需求需要往many2many中间表增加第三列,

    那你可以去改框架,

    给中间表增加第三列对应的业务逻辑



  • @siyuan
    1、中间表数据库应该有记录的吧
    2、模型名是product.template,column1页不应该是product_template_id?



  • @hui

    1. 中间表数据库肯定有,如果没有那就是模型升级没成功

    2. 如果你是product_template 里面有一个字段和别的表是 many2many关系,

    那么这个字段的many2many 中间表的column1 列名默认:product_template_id,



  • @siyuan
    1、模块升级是成功的了的
    2、我这个m2m的是product.templateproduct.template,按理不是应该column都应该是product_template_id,上面代码那样写是给的别名吗?



  • 此回复已被删除!

  • 管理员

    @hui 你这是一个compute字段,并且store=False,系统是不会生成对应的中间表的。



  • @digitalsatori
    1、store=False,不生成中间表的话,那我这里写了一个中间表没问题吗?
    2、如果不生成中间表,那他们的对应关系是怎么存储的?


  • 管理员

    这个字段的值,是你定义的函数_get_old_part_list算出来的啊



  • @digitalsatori
    我知道那个字段的值是我算出来的。
    但是如果没有这个中间表,我还是写了relation是不是错的了啊?


  • 管理员

    想想看,即使有这个中间表,你都根本没有用到,有意义吗?



  • @digitalsatori
    没意义。

    这个中间表不存在的,那relation引用一个没有的,column1,column2的值也是没有的,这个也不报错的啊?