2

嗨,我一直在使用 Python 开发 OpenERP 模块。我一直在浏览源代码并且在理解它时遇到了问题。我不明白以下两行 self.browse 以 id,uid 作为参数然后使用具有功能的工具

  for obj in self.browse(cr, uid, ids, context=context):

           result[obj.id] = tools.image_get_resized_images(obj.image)

请给我一些关于这方面的知识。谢谢希望建议

4

2 回答 2

4

简单来说browse就是启用read对数据库表记录的操作的方法。browse方法将记录作为对象获取,允许使用点符号浏览字段和关系。这使 OpenERP 编程接近 OOP。

OpenERP 框架是使用 ORM 和 MVC 设计模式在 Python 编程中编写的。ORM 将使用值包装在 Object 中,并允许在各种方法即URL中进行 CRUD 操作方法。read方法是browse读取返回字典的python列表和浏览返回每个对象记录在数据库中的对象列表的方法的替代方法。

所以对你的代码的分析是:这条语句 for obj in self.browse(cr, uid, ids, context=context):可以分成几行。1. self.browse(cr, uid, ids, context=context) 从 self(object) 获取记录(ids)。2. for that is loop through the return of the above。所以每次循环迭代它都会存储obj基本上是 db 记录的记录,因为它是记录和对象,它会将平板电脑列值作为属性包装在侧面,因此您可以使用 obj.field_name 获取字段值

希望这会有所帮助。

于 2013-10-07T13:31:19.600 回答
1

正如在 Firebug 的回答中一样,您可以将浏览视为读取或简单地说,SQL 选择语句,但有一些区别。从技术上讲,它们表示由 ORM 模型定义的数据的一个实例——product.product 定义模型(或表),浏览记录是表中的一行数据。

Browse 采用单个 ID(例如 1)并返回浏览记录或采用 Id 列表[1,2,3...]并返回浏览记录列表。

它最终确实从数据库中读取,但它也做了一些其他读取没有的事情;

  1. 缓存
  2. 延迟加载到任意深度 ( sale_order_line.sale_order.partner.email)
  3. 处理功能字段、关系字段(many2one、one2many)、相关字段等虚拟字段。

在最简单的意义上,将其视为select * from my_table where id = %s然后从结果中组装一个对象。

需要注意的几点:

  1. 浏览记录总是有一个 ID - 例如product.id
  2. 您不能将浏览记录传递给客户端。如果您尝试看到“关闭后使用的光标”消息,它们会延迟加载并保留数据库游标。
  3. 他们不能很好地处理浏览丢失的记录。确保您正在浏览的记录存在。通常这不是您必须担心的事情,但如果您需要确定,请进行搜索。
  4. 浏览记录工具__eq__,这样你就可以去if product_browse_record == other_product_browse_record工作了。
  5. 一个非常常见的模式是如上所示:

    对于 product_model.browse(cr, uid, ids, context = context) 中的产品:对我的产品做一些事情

这在 100 次中有 99 次都可以,但请注意,它将一次性读取所有数据库记录并构建对象列表。如果你有一个巨大的 ID 列表,你将使用一大块内存。

于 2013-10-08T08:48:19.597 回答