跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. Many2many 向前引用问题

Many2many 向前引用问题

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
16 帖子 3 发布者 11.3k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • O 离线
    O 离线
    oldrev
    写于 最后由 编辑
    #2

    没人遇到过?

    1 条回复 最后回复
    0
    • digitalsatoriD 离线
      digitalsatoriD 离线
      digitalsatori 管理员
      写于 最后由 编辑
      #3

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

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

      1 条回复 最后回复
      0
      • O 离线
        O 离线
        oldrev
        写于 最后由 编辑
        #4

        [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 条回复 最后回复
        0
        • mrshellyM 离线
          mrshellyM 离线
          mrshelly
          写于 最后由 编辑
          #5

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

          1 条回复 最后回复
          0
          • O 离线
            O 离线
            oldrev
            写于 最后由 编辑
            #6

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

            1 条回复 最后回复
            0
            • O 离线
              O 离线
              oldrev
              写于 最后由 编辑
              #7

              详细错误信息:[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 条回复 最后回复
              0
              • digitalsatoriD 离线
                digitalsatoriD 离线
                digitalsatori 管理员
                写于 最后由 编辑
                #8

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

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

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

                1 条回复 最后回复
                0
                • O 离线
                  O 离线
                  oldrev
                  写于 最后由 编辑
                  #9

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

                  1 条回复 最后回复
                  0
                  • digitalsatoriD 离线
                    digitalsatoriD 离线
                    digitalsatori 管理员
                    写于 最后由 编辑
                    #10

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

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

                    1 条回复 最后回复
                    0
                    • O 离线
                      O 离线
                      oldrev
                      写于 最后由 编辑
                      #11

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

                      1 条回复 最后回复
                      0
                      • digitalsatoriD 离线
                        digitalsatoriD 离线
                        digitalsatori 管理员
                        写于 最后由 编辑
                        #12

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

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

                        1 条回复 最后回复
                        0
                        • O 离线
                          O 离线
                          oldrev
                          写于 最后由 编辑
                          #13

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

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

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

                          1 条回复 最后回复
                          0
                          • digitalsatoriD 离线
                            digitalsatoriD 离线
                            digitalsatori 管理员
                            写于 最后由 编辑
                            #14

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

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

                            1 条回复 最后回复
                            0
                            • O 离线
                              O 离线
                              oldrev
                              写于 最后由 编辑
                              #15

                              调试通过了

                              1 条回复 最后回复
                              0

                              • 登录

                              • 没有帐号? 注册

                              • 登录或注册以进行搜索。
                              • 第一个帖子
                                最后一个帖子
                              0
                              • 版块
                              • 标签
                              • 热门
                              • 用户
                              • 群组