Odoo 中文社区

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • Popular
    • Users
    • Groups

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

    由于系统升迁的原因,本论坛部分较早期的内容存在格式和链接损坏失效的问题,并非本论坛系统本身的缺陷,望谅解

    本社区没有维护任何QQ群讨论组,任何与本社区同名的QQ群讨论组的言论与本社区无关!

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

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

    Many2many 向前引用问题

    Odoo 开发与实施交流
    3
    16
    10366
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • O
      oldrev last edited by

      两个互为 many2many 对象的互相引用,在内置的 base.res.users 和 base.res.groups 之间就没有问题,但是我自己写的两个对象之间就有问题,系统在加载模块建表时会提示找不到关联的另一个表。

      真是奇怪,不知有没有人遇过同样情况。

      1 Reply Last reply Reply Quote 0
      • O
        oldrev last edited by

        没人遇到过?

        1 Reply Last reply Reply Quote 0
        • digitalsatori
          digitalsatori 管理员 last edited by

          能否贴一下代码,一起研究下

          【上海先安科技】(tony AT openerp.cn)

          1 Reply Last reply Reply Quote 0
          • O
            oldrev last edited by

            [code]# 驾驶员信息
            class driver(osv.osv):
            _name = "transit.driver"
            _description = "驾驶员信息"
            _inherits = {'hr.employee': 'name'}
            _columns = {
            'name': fields.many2one ('hr.employee','姓名', domain=[('is_driver', '=', "1")], required=True, help="驾驶员的姓名"),
            'active': fields.boolean('有效'),
            'code': fields.char ('驾照', size=128, help="驾驶证编号"),
            'license': fields.char ('准驾证', size=128, help="准驾证编号"),
            'vehicle_ids': fields.many2many ('transit.vehicle', 'transit_vehicles_drivers_rel','driver_id','vehicle_id', '相关车辆'), #应该就是这里引起的
            'notes': fields.text ('备注'),
            }
            _defaults = {
            'active': lambda *a: True,
            }
            _sql_constraints = [
            ('code_key', 'UNIQUE (code)', '驾照不能重复!'),
            ('license_key', 'UNIQUE (license)', '准驾证不能重复!')
            ]
            driver()

            class vehicle(osv.osv):
            _name = 'transit.vehicle'
            _description = '车辆档案'

            def _get_models(self, cr, uid, context={}):
                return common.get_objects_for_selection(self, cr, uid, 'transit.vehicle.model', context) 
            
            
            _columns = {
                'name': fields.char('编号', size=50, required=True, help='公司或车队内部的自编号'),
                'active': fields.boolean('有效'),
                'license': fields.char('牌照', size=50, required=True),
                'passenger_capacity': fields.integer('乘员数'),
                'transit_capacity': fields.float('载重量(顿)'),
                'description': fields.text('说明'),
                'category_id': fields.many2one('transit.vehicle.category', '分类', required=True),
                'model': fields.selection(_get_models, "车型"),
                'driver_ids': fields.many2many ('transit.driver', 'transit_vehicles_drivers_rel','vehicle_id','driver_id', '驾驶员'),
                'ein': fields.char('发动机号', size=128, required=False),
                'insurance': fields.char('保险号', size=128, required=False),
                'frame_number': fields.char('车架号', size=128, required=False),
                'chassis_number': fields.char('底盘号', size=128, required=False),
                'depreciation': fields.float('月折旧', 
                    digits=(16, int(config['price_accuracy'])), help='车辆月折旧费用的估计值'),
                'oil_consumption': fields.float('百公里油耗', help='车辆百公里耗油量的估计值'),
                'state': fields.selection([
                    ('ready','待命'),
                    ('transporting','运输途中'),
                    ('maintaining','正在维护'),
                    ('scrapped','报废'), ], '车辆状态', readonly=True, help='该车辆在系统中的状态', select=True),
            }
            
            _defaults = {
                'active':   lambda *a: True,
            }
            _sql_constraints = [
                ('license_key', 'UNIQUE (license)', '车辆牌照不能重复!')
            ]
            

            vehicle()[/code]

            1 Reply Last reply Reply Quote 0
            • mrshelly
              mrshelly last edited by

              看起来好象没有什么问题呀...

              1 Reply Last reply Reply Quote 0
              • O
                oldrev last edited by

                我在安装模块的时候提示无法找到关系“transit_vehicle”

                1 Reply Last reply Reply Quote 0
                • O
                  oldrev last edited by

                  详细错误信息:[code]
                  Traceback (most recent call last):
                  File "D:devopenerpstableserverbinnetsvc.py", line 235, in dispatch
                  result = LocalService(service_name)(method, *params)
                  File "D:devopenerpstableserverbinnetsvc.py", line 74, in call
                  return getattr(self, method)(*params)
                  File "D:devopenerpstableserverbinserviceweb_services.py", line 582, in execute
                  return self.execute(db, uid, wiz_id, datas, action, context)
                  File "D:devopenerpstableserverbinserviceweb_services.py", line 562, in execute
                  return wiz.execute(db, uid, self.wiz_datas[wiz_id], action, context)
                  File "D:devopenerpstableserverbinwizard__init
                  .py", line 178, in execute
                  res = self.execute_cr(cr, uid, data, state, context)
                  File "D:devopenerpstableserverbinwizard__init__.py", line 74, in execute_cr
                  action_res = action(self, cr, uid, data, context)
                  File "D:devopenerpstableserverbinaddonsbasemodulewizardwizard_module_upgrade.py", line 92, in upgrade_module
                  db, pool = pooler.restart_pool(cr.dbname, update_module=True)
                  File "D:devopenerpstableserverbinpooler.py", line 62, in restart_pool
                  return get_db_and_pool(db_name, force_demo, status, update_module=update_module)
                  File "D:devopenerpstableserverbinpooler.py", line 40, in get_db_and_pool
                  addons.load_modules(db, force_demo, status, update_module)
                  File "D:devopenerpstableserverbinaddons__init
                  _.py", line 718, in load_modules
                  r = load_module_graph(cr, graph, status, report=report)
                  File "D:devopenerpstableserverbinaddons__init__.py", line 581, in load_module_graph
                  init_module_objects(cr, package.name, modules)
                  File "D:devopenerpstableserverbinaddons__init__.py", line 366, in init_module_objects
                  result = obj._auto_init(cr, {'module': module_name})
                  File "D:devopenerpstableserverbinosvorm.py", line 1532, in _auto_init
                  cr.execute('CREATE TABLE "%s" ("%s" INTEGER NOT NULL REFERENCES "%s" ON DELETE CASCADE, "%s" INTEGER NOT NULL REFERENCES "%s" ON DELETE CASCADE) WITH OIDS' % (f._rel, f._id1, self._table, f._id2, ref))
                  File "D:devopenerpstableserverbinsql_db.py", line 76, in wrapper
                  return f(self, *args, **kwargs)
                  File "D:devopenerpstableserverbinsql_db.py", line 120, in execute
                  res = self._obj.execute(query, params)
                  ProgrammingError: relation "transit_vehicle" does not exist

                  [/code]

                  1 Reply Last reply Reply Quote 0
                  • digitalsatori
                    digitalsatori 管理员 last edited by

                    这个错误应该是因为transit.vehicle对象还没有被初始化就被调用了。把vehicle类放到driver类之前试试?

                    另外,_inherits在这里用来表示一对一关系的,可是name,active字段与父类重复,应该也会有问题的。

                    【上海先安科技】(tony AT openerp.cn)

                    1 Reply Last reply Reply Quote 0
                    • O
                      oldrev last edited by

                      两个具有 many2many 的对象,谁放到前面建表的时候就会提示找不到另一个对象

                      1 Reply Last reply Reply Quote 0
                      • digitalsatori
                        digitalsatori 管理员 last edited by

                        哦,想简单了。
                        假设driver类在前,vehicle类在后。 在driver类中先不声明对vehicle的many2many引用,而在vehicle类之后再创建对driver的继承类并添加many2many field. 看看这样是不是可以?

                        【上海先安科技】(tony AT openerp.cn)

                        1 Reply Last reply Reply Quote 0
                        • O
                          oldrev last edited by

                          这样应该是可以的,可问题是内置的 res.users 和 res.roles 就可以直接用 many2many 互相引用,我的就不行

                          1 Reply Last reply Reply Quote 0
                          • digitalsatori
                            digitalsatori 管理员 last edited by

                            res.user和res.roles对应的表是在服务器初始化的时候由base.sql 创建好的,所以没有初始化的先后关系的问题。

                            【上海先安科技】(tony AT openerp.cn)

                            1 Reply Last reply Reply Quote 0
                            • O
                              oldrev last edited by

                              那只有按你说的了:
                              先把两个不包含 many2many 属性的对象定义放在前面,然后又用单表继承的方法加入 many2many 属性

                              唯一的问题是这样太不直观了,难道 Tiny 的人没有想过这个问题?就不能先把表都建好再加上约束?

                              [[i] 本帖最后由 oldrev 于 2009-6-7 22:33 编辑 [/i]]

                              1 Reply Last reply Reply Quote 0
                              • digitalsatori
                                digitalsatori 管理员 last edited by

                                oldrev, 你的代码现在调试通过了吗?我想跟踪一下,我也在官方论坛里问一下有没有更好的办法。

                                【上海先安科技】(tony AT openerp.cn)

                                1 Reply Last reply Reply Quote 0
                                • O
                                  oldrev last edited by

                                  调试通过了

                                  1 Reply Last reply Reply Quote 0
                                  • First post
                                    Last post