按功能字段排序OpenERP表格
在搜索界面上,用户可以通过点击列标题来对结果进行排序。不过,这个功能并不是对所有列都有效。对于像名字和价格这样的普通字段,它们直接存储在表格里,所以排序没问题。对于多对一的字段,通过连接到相关的表格并使用那个表的默认排序方式,也可以正常排序。
但是,大多数功能字段和相关字段就不行了。(相关字段其实是一种功能字段。)当你点击那个列的时候,系统就是不理你。如果你把字段的定义改成存储在数据库里,那你就可以按照这个字段排序,但这样做真的有必要吗?有没有办法在不把功能字段的值存储到数据库里的情况下进行排序呢?
2 个回答
1
存储这个字段的原因是,你把排序的工作交给了数据库(sql)来处理,这样能比后续的任何排序方式更快,性能更好。
3
显然,这个话题已经引起了一些讨论,CampToCamp 提出了一个 合并提案,提供了一个通用的解决方案。他们的 博客 上也有一些相关讨论。
我还没有尝试他们的解决方案,但我为一个特定的字段创建了一个解决方案,通过重写 _generate_order_by()
方法来实现。每当用户点击某个列的标题时,_generate_order_by()
就会尝试生成一个合适的 ORDER BY
子句。我发现其实可以在 ORDER BY
子句中放一个 SQL 子查询,以便为功能字段生成值。
举个例子,我们添加了一个 功能字段,用来显示每个产品的第一个供应商的名字。
def _product_supplier_name(self, cr, uid, ids, name, arg, context=None):
res = {}
for product in self.browse(cr, uid, ids, context):
supplier_name = ""
if len(product.seller_ids) > 0:
supplier_name = product.seller_ids[0].name.name
res[product.id] = supplier_name
return res
为了按这个列排序,我们 重写了 _generate_order_by()
方法,使用了一些相当复杂的 SQL。对于其他列,我们则使用常规代码。
def _generate_order_by(self, order_spec, query):
""" Calculate the order by clause to use in SQL based on a set of
model fields. """
if order_spec != 'default_partner_name':
return super(product_product, self)._generate_order_by(order_spec,
query)
return """
ORDER BY
(
select min(supp.name)
from product_supplierinfo supinf
join res_partner supp
on supinf.name = supp.id
where supinf.product_id = product_product.id
),
product_product.default_code
"""