3

検索画面では、ユーザーは列ヘッダーをクリックして結果を並べ替えることができます。残念ながら、これはすべての列で機能するわけではありません。これは、テーブル自体に格納されている名前や価格などの通常のフィールドで正常に機能します。また、参照されるテーブルに結合し、そのテーブルのデフォルトのソート順を使用することにより、多対1のフィールドに対しても機能します。

動作しないのは、ほとんどの機能フィールドと関連フィールドです。(関連フィールドは機能フィールドの一種です。)列をクリックすると、無視されます。データベースに保存するフィールド定義を変更すると、それで並べ替えることができますが、それは必要ですか?データベースに値を保存せずに機能フィールドで並べ替える方法はありますか?

4

2 に答える 2

3

どうやらこれについていくつかの議論があり、CampToCampは一般的な解決策との統合提案を投稿しました。彼らのブログにもいくつかの議論があります。

私はまだ彼らの解決策を試していませんが、_generate_order_by()メソッドをオーバーライドすることによって、1つのフィールドに対して特定の解決策を作成しました。ユーザーが列ヘッダーをクリックするたびに、適切な句_generate_order_by()を生成しようとします。実際にSQLサブクエリを句に入れて、機能フィールドの値を再現ORDER BYできることがわかりました。ORDER BY

例として、各製品の最初のサプライヤの名前を表示する機能フィールドを追加しました。

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

その列で並べ替えるために、かなりファンキーなSQLで上書きします。_generate_order_by()その他の列については、通常のコードに委任します。

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
        """
于 2013-03-25T17:24:34.330 に答える
1

フィールドを保存する理由は、ソートをsqlに委任するためです。これにより、他の後続のソートよりも確実にパフォーマンスが向上します。

于 2013-03-26T08:35:39.290 に答える