在搜索屏幕上,用户可以通过单击列标题对结果进行排序。不幸的是,这并不适用于所有列。它适用于存储在表格中的常规字段,如名称和价格。它也适用于多对一的字段,方法是加入引用的表并使用该表的默认排序顺序。按功能字段对OpenERP表进行排序
什么是不工作是最功能的领域和相关领域。 (相关字段是一种功能字段。)当您单击该列时,它只是忽略您。如果您将字段定义更改为存储在数据库中,那么您可以按照它进行排序,但这是否有必要?有没有什么办法可以按功能字段进行排序而不将其值存储在数据库中?
在搜索屏幕上,用户可以通过单击列标题对结果进行排序。不幸的是,这并不适用于所有列。它适用于存储在表格中的常规字段,如名称和价格。它也适用于多对一的字段,方法是加入引用的表并使用该表的默认排序顺序。按功能字段对OpenERP表进行排序
什么是不工作是最功能的领域和相关领域。 (相关字段是一种功能字段。)当您单击该列时,它只是忽略您。如果您将字段定义更改为存储在数据库中,那么您可以按照它进行排序,但这是否有必要?有没有什么办法可以按功能字段进行排序而不将其值存储在数据库中?
显然已经有一些这方面的讨论,CampToCamp公布了一个merge proposal与一个通用的解决方案。 their blog也有一些讨论。
我还没有尝试过自己的解决办法,但我确实通过重写_generate_order_by()
方法创建一个领域特定的解决方案。只要用户点击列标题,_generate_order_by()
就会尝试生成适当的ORDER BY
子句。我发现实际上可以在ORDER BY
子句中放置一个SQL子查询来重现功能字段的值。
作为一个例子,我们添加了一个functional field各产品显示第一供应商的名称。
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
为了通过该列进行排序,我们overrode _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
"""
存储字段的原因是,您将排序委托给sql,当然,这会给您比其他任何后续排序更多的性能。