在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查询但显示相同的问题。
答案 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