常用的的 ORM 方法

既然使用了 ORM 来定义数据模型,那么如何来操作数据呢?这就要用到 Odoo ORM 的方法,接下来介绍几个常用的 ORM 方法。

在介绍这些方法之前,我们需要进入 Odoo 的交互式命令行,进入 odoo_dev 目录并输入以下命令:

$ ./odoo-bin shell -c ./odoorc

💡 建议在使用 Odoo 交互式命令行之前安装 IPython,方便进行代码补全和使用。

⚠️ 进入命令行前必须将配置文件的 db_name 参数配置成安装了 bangumi 应用相同的数据库,或使用 -d 参数指定数据库。

在上一章节有提到 api 模块中的 Environment 类,我们就是要用这个初始化出一个 env 来操作数据库,不过 Odoo 已经在启动命令行时帮助我们将这个 env 初始化好了。

In [1]: env                               
Out[1]: <odoo.api.Environment at 0x108d84438>

我们可以利用 env 来得到我们的数据库模型,并且操作数据库表。

In [2]: env['bangumi.bangumi']
Out[2]: bangumi.bangumi()

接下来我们将利用以下常见的 ORM 方法来操作我们的数据模型。

⚠️ 在 Odoo 交互式命令行中对数据进行,创建、修改和删除后必须要执行 env.cr.commit() 才会将数据操作写入数据库中。

  • create()

    create 方法用于创建模型数据,参数可以为 dictlist 类型,创建后会返回创建的记录或记录集。

      In [3]: env['bangumi.bangumi'].create({'name': 'Fate', 'total': 24})                
      Out[3]: bangumi.bangumi(1,)
      In [4]: env['bangumi.bangumi'].create([{'name': 'SAO', 'total': 24}, {'name': 'Jojo', 'total': 24}])
      Out[4]: bangumi.bangumi(2, 3)
      In [5]: env.cr.commit()
    
  • search()

    search 方法用于搜索已存在的数据,与大多数 ORM 框架不同,Odoo 搜索时传入的是一个 domain,它是一个列表形式的参数,在后面的章节会详细介绍这里先不做讲解。 除了 domain 参数,还有 offsetlimitordercount,这些都是可选字段。

      In [6]: env['bangumi.bangumi'].search([('name', '=', 'Fate')]).name
      Out[6]: 'Fate'
      In [7]: env['bangumi.bangumi'].search([('total', '=', 24)], limit=2)
      Out[7]: bangumi.bangumi(1, 2)
      In [8]: env['bangumi.bangumi'].search([])
      Out[8]: bangumi.bangumi(1, 2, 3)
    
  • write()

    write 方法用于修改数据,传入参数为 dict 类型,修改后会返回布尔值 True

      In [9]: env['bangumi.bangumi'].search([('name', '=', 'SAO')]).write({'total': 12})
      Out[9]: True
      In [10]: env.cr.commit()
    
  • browse()

    browse 方法可以通过 id 直接返回数据或结果集,参数可以为 dictlist 类型。

      In [11]: env['bangumi.bangumi'].browse(1)
      Out[11]: bangumi.bangumi(1,)
      In [12]: records = env['bangumi.bangumi'].browse([1, 2, 3])
      In [13]: records                       
      Out[13]: bangumi.bangumi(1, 2, 3)
    
  • unlink()

    unlink 方法用于用于删除数据或结果集,删除后返回布尔值 True,结果集可以为空,相当于没有操作。

      In [14]: env['bangumi.bangumi'].search([{'name': 'Jojo'}]).unlink()
      Out[14]: True 
      In [15]: env.cr.commit()
    
  • exists()

    exists 用于过滤出数据库中确实存在的数据,这个用法比较奇特需要注意一下。

    在上文中我们用 browse 方法搜索出了记录集 records

      In [16]: records                       
      Out[16]: bangumi.bangumi(1, 2, 3)
    

    但是实际上 id 为3的数据已经被我们删除了,我们一般会觉得需要重新使用 search 方法搜索数据,这里我们可以利用 Odoo 的 exists 方法,他只会返回数据库中存在的数据或记录集。

      In [17]: records.exists()
      Out[17]: bangumi.bangumi(1, 2,)
    

    利用这个函数我们可以在删除了一些数据后,用于判断数据或记录集是否为空。

      if not records.exists():
          # do something ...
          pass
    

💡 搜索到的记录集中的数字代表记录的 id

results matching ""

    No results matching ""