使用' len()'按搜索功能的顺序

时间:2014-03-11 11:38:04

标签: python openerp openerp-7

我想在ORM的搜索方法中应用len(one2many_field)。像这样search(..,order = "len(one2many_field)",..)。我想通过查找他们孩子的总数来订购结果。 one2many字段与同一个表的关系。目前,我无法在len()中使用order

示例:

 id    name    parent_id
  1     A       - 
  2     B       1 
  3     C       1 
  4     D       - 
  5     E       4

结果:

A
D

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望能够进行查询,例如向我显示所有具有三个或更多订单行的销售订单(例如)。我在这里使用销售订单和销售订单行作为示例,但只是替换您正在使用的任何父/子模型。

  1. 延长销售订单并添加一个功能字段,只返回销售订单行one2many字段的数量。
  2. 将其设为已触发的存储字段。有关此示例,请查看销售订单中的金额存储方式。您可以复制并粘贴它,但更改字段名称。
  3. 在搜索中使用if:

    sale_order_model.search(cr,uid,[(' my_count_field','> =',3)],context = context)

  4. 这里唯一棘手的部分是让商店触发器正确,但销售订单金额就是一个很好的例子。

答案 1 :(得分:0)

我不认为可以在orm搜索方法的order参数上使用len(),因为该参数必须是逗号分隔的有效字段名称列表。供参考,用于构造order by子句(用于查询)的openerp代码:

def _generate_order_by(self, order_spec, query):
        """
        Attempt to consruct an appropriate ORDER BY clause based on order_spec, which must be
        a comma-separated list of valid field names, optionally followed by an ASC or DESC direction.

        :raise" except_orm in case order_spec is malformed
        """
...

你会在下面找到:openerp-server.openerp.osv.orm.BaseModel