跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • 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. odoo同时创建多条记录

odoo同时创建多条记录

已定时 已固定 已锁定 已移动 Odoo 新手求助
8 帖子 4 发布者 6.0k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • D 离线
    D 离线
    dodo
    写于 最后由 编辑
    #1

    如果要创建多条记录(例如几千),只能通过多次调用create方法吗,有没有批量操作的方法

    1 条回复 最后回复
    0
    • S 离线
      S 离线
      Siyuan
      写于 最后由 编辑
      #2

      可以直接cr.execute 运行psql 命令,用 insert into 增加记录。

      前提是你要对新建记录的表的结构非常熟悉

      D 1 条回复 最后回复
      0
      • D 离线
        D 离线
        dodo
        写于 最后由 编辑
        #3
        此回复已被删除!
        1 条回复 最后回复
        0
        • D 离线
          D 离线
          dodo
          在 回复了 Siyuan 最后由 编辑
          #4

          @siyuan 直接用orm没法实现是吗

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

            一般不会在addons模块内部来创建几千条记录这样的代码。大量记录的创建有几个方法一个是 @Siyuan 提到的用SQL来直接对数据库操作,无论是在odoo框架下用cr.execute执行还是直接用SQL外部工具来创建。这种方法的优势是效率高,速度快,但是弱点是会旁路Odoo对象内部的所有约束,关联操作等。

            多条记录创建一般的做法是使用Odoo内置的导入工具导入(base_import),

            当然如果数据比较复杂,你也可以使用xml-rpc工具导入,其原理一样是循环调用create方法。

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

            D 1 条回复 最后回复
            0
            • S 离线
              S 离线
              Siyuan
              在 回复了 dodo 最后由 编辑
              #6

              @dodo orm 的话,除非你改框架,这涉及到default,compute 等字段的计算;

              具体要参考models.py 下面单个记录的create的方法了。

              @api.model
              @api.returns('self', lambda value: value.id)
              def create(self, vals):
                  """ create(vals) -> record
              
                  Creates a new record for the model.
              
                  The new record is initialized using the values from ``vals`` and
                  if necessary those from :meth:`~.default_get`.
              
                  :param dict vals:
                      values for the model's fields, as a dictionary::
              
                          {'field_name': field_value, ...}
              
                      see :meth:`~.write` for details
                  :return: new record created
                  :raise AccessError: * if user has no create rights on the requested object
                                      * if user tries to bypass access rules for create on the requested object
                  :raise ValidateError: if user tries to enter invalid value for a field that is not in selection
                  :raise UserError: if a loop would be created in a hierarchy of objects a result of the operation (such as setting an object as its own parent)
                  """
                  self.check_access_rights('create')
              
                  # add missing defaults, and drop fields that may not be set by user
                  vals = self._add_missing_default_values(vals)
                  for field in itertools.chain(MAGIC_COLUMNS, ('parent_left', 'parent_right')):
                      vals.pop(field, None)
              
                  # split up fields into old-style and pure new-style ones
                  old_vals, new_vals, unknown = {}, {}, []
                  for key, val in vals.iteritems():
                      field = self._fields.get(key)
                      if field:
                          if field.column or field.inherited:
                              old_vals[key] = val
                          if field.inverse and not field.inherited:
                              new_vals[key] = val
                      else:
                          unknown.append(key)
              
                  if unknown:
                      _logger.warning("%s.create() includes unknown fields: %s", self._name, ', '.join(sorted(unknown)))
              
                  # create record with old-style fields
                  record = self.browse(self._create(old_vals))
              
                  # put the values of pure new-style fields into cache
                  record._cache.update(record._convert_to_cache(new_vals))
                  # mark the fields as being computed, to avoid their invalidation
                  for key in new_vals:
                      self.env.computed[self._fields[key]].add(record.id)
                  # inverse the fields
                  for key in new_vals:
                      self._fields[key].determine_inverse(record)
                  for key in new_vals:
                      self.env.computed[self._fields[key]].discard(record.id)
              
                  return record
              
              1 条回复 最后回复
              0
              • JoshuaJ 离线
                JoshuaJ 离线
                Joshua 管理员
                写于 最后由 编辑
                #7

                建议调用create实现批量创建

                【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

                1 条回复 最后回复
                0
                • D 离线
                  D 离线
                  dodo
                  在 回复了 digitalsatori 最后由 编辑
                  #8

                  @digitalsatori 谢谢您的回复

                  1 条回复 最后回复
                  0

                  • 登录

                  • 没有帐号? 注册

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