2

このサンプルモデルを考えてみましょう。

MODEL_CHOICES =((u "SPAM"、u "Spam")、(u "XOUP"、u "Eggsoup")、)

(をちょきちょきと切る)

type = models.CharField(max_length = 4、choices = MODEL_CHOICES)

(実際の実装はドメイン固有であり、英語以外であるため、このサンプルで行う必要があります。)

クエリを作成するときに、そのタイプフィールドで結果を並べ替えて、結果をユーザーに表示したいと思います。当然、そのフィールドの表示名で並べ替えたいと思います。

次のようなもの:

ドキュメント=MyModel.objects.filter(...)。order_by( "type")

ただし、[query-set].order_by([field])フィールド名での並べ替えのみが許可されているため、Eggsoup <Spam(人間の読者にとって)であっても、SPAM <XOUP(マシンに対して)になります。

タイプ別にソートされたこのインスタンスのセットについて考えてみます。

名前| タイプ

obj1 | スパム

obj2 | スパム

obj3 | スパム

obj4 | XOUP

obj5 | XOUP

ただし、これはユーザーに表示される順序です。つまり、ユーザーには、タイプ列の内部フィールド値ではなく、表示名が表示されます。

名前| タイプ

obj1 | スパム

obj2 | スパム

obj3 | スパム

obj4 | エッグスープ

obj5 | エッグスープ

人間のユーザーの目には、これは正しくソートされていません。

表示名で並べ替えることができるDjangoの機能はありますか?または、これを「手動で」達成する方法はありますか?(表示名が実際の値と同じ順序になるように選択肢の名前を変更することはできません。)

4

2 に答える 2

4

結果セットが十分に小さい場合は、コードで結果のメモリ内並べ替えを行うことができます。結果をデータベースレベルでソートするまともな方法は考えられません。表示名を認識するストアド プロシージャを使用した場合は確かに可能ですが、生の SQL を記述する必要があります。手動ソートについては、次のようなものを使用できます。

obj_list = list(Model.objects.all())
import operator
obj_list.sort(key=operator.methodcaller('get_foo_display'))

Python でリストをソートする方法の良い例を次に示します: http://wiki.python.org/moin/HowTo/Sorting

于 2010-01-06T19:37:21.210 に答える
0

表示名もモデルに由来すると仮定すると、そのフィールドで並べ替えて、必要に応じて選択肢を並べ替えることができます。

MODEL_CHOICES = MyModel.objects.all().values_list('value_field', 'display_field').order_by('display_field')
...
type = models.CharField(max_length=4, choices=MODEL_CHOICES)

質問のように選択肢が定数である場合は、定数の順序を変更するだけです。

MODEL_CHOICES = ((u"XOUP", u"Eggsoup"), (u"SPAM", u"Spam"), )

最終的に、選択肢は単なるタプルのリストになるため、通常の Python ソートでソートできます。Python wiki には、2 番目の要素でタプルのリストをソートする良い例があります。

于 2010-01-06T18:05:43.023 に答える