在OpenERP 7.0的列表视图中按选择排序

时间:2013-08-12 12:23:10

标签: python openerp postgresql-8.4

在OpenERP 7列表视图中,我想显示订单草稿中的状态值排序,当前在Asc或Desc中显示已分配和取消。但在我的情况下,我们需要在订单草稿,分配和取消状态中进行排序。基于在python文件中按顺序应用

例如在SQL代码中 -

select state, date from  object_name
ORDER BY CASE WHEN state = 'draft'  THEN 0 
              WHEN state = 'assigned'  THEN 1 
              WHEN state = 'cancel'  THEN 2
              ELSE 3
END,  date desc

以上在python中应用的sql代码

_order = ("CASE WHEN state='draft'  THEN 0",
          "WHEN state = 'assigned'  THEN 1",
          "ELSE 2 END, date desc")

在上面的查询排序选择值工作在pg_admin但在python代码中它显示错误

Invalid "order" specified. A valid "order" specification is a comma-separated
list of valid field names (optionally followed by asc/desc for the direction)

根据选择值的排序顺序如何在OpenERP中应用?覆盖搜索方法也应用了相同的sql查询但显示相同的问题。

4 个答案:

答案 0 :(得分:2)

尝试使用store属性创建功能字段,该属性在状态更改时加载函数。 例如

def _get_state(cr, uid, ids,field_name, context=None):
    res={}
    for obj in self.browse(cr, uid, ids, context):
        res[obj.id] = (obj.state=='draft' and 0) or (obj.state=='assigned' and 1) or (obj.state=='cancel' and 2) or 3
    return res

_columns = {
current_state_num: fields.function(_get_state,string='Current state',type='integer',store={'your.current.model.name':(lambda cr, uid, ids, context:ids,['state'],20)})
}
_order = "current_state_num,date desc"

答案 1 :(得分:0)

一种可能的解决方案是从python函数执行查询本身。然后,您可以从操作或其他方法调用该函数。 e.g。

def _my_custom_search(self, cr, uid, object_name, context=None):
    sql_req = """
select id, state, date from  %s
ORDER BY CASE WHEN state = 'draft'  THEN 0 
              WHEN state = 'assigned'  THEN 1 
              WHEN state = 'cancel'  THEN 2
              ELSE 3
END,  date desc""" %(object_name, )

    cr.execute(sql_req)
    res = cr.fetchall()
    return res

除了您要订购的字段外,您还需要选择id字段。另一种可能性是更改视图上的默认过滤器。 Adding default filter on tree view

答案 2 :(得分:0)

另一种解决方法是按状态排序并更改字段中状态的顺序:

'state': fields.selection([('draft','Draft'),('assigned','Assigned'), ('cancel','Cancelled'),('other' ....
...
_order = "state, date desc"

或者您可以创建一个新的函数字段(例如sort_priority)并使用类似的函数将值赋给优先级,然后按该字段排序。

答案 3 :(得分:0)

如果您能阅读德语,this blog post有一个很好的解决方案。这是它的改编版本:

class some_table(osv.Model):
    _name = 'some.table'
    _columns = {
        ...
        ...
        'state' : field.selection(...),
        ...
        ...

    def _generate_order_by(self, order_spec, query):
        "correctly orders state field if state is in query"
        order_by = super(some_table, self)._generate_order_by(order_spec, query)
        if order_spec and 'state ' in order_spec:
            state_column = self._columns['state']
            state_order = 'CASE '
            for i, state in enumerate(state_column.selection):
                state_order += "WHEN %s.state='%s' THEN %i " % (self._table, state[0], i)
            state_order += 'END '
            order_by = order_by.replace('"%s"."state" ' % self._table, state_order)
        return order_by