2017-05-24 7 views
0

私はDjangoでリーダーボードを作っています。それは酔っている何かを除いて、ほとんどのものを偉大な行います。正常ではないのですDjango降順で注文しています

enter image description here

! 70は540と200より高いです! 1位ではなく3位にする必要があります!なぜそれが起こっているのですか、それをどうやって修正できるのですか?

私はこれを使用して降順で合計またはtotalpointsを使用してリーダーボードを注文しています:participants = Participant.objects.order_by('-totalpoints')

70が欠落していたとき、これは起こりませんでした。それがそこにあるとき、それは不具合を起こす。また、Total pointsがすべての課題から追加され、ASCIIや他の何かに問題があった場合はクラッシュしました。

ご協力いただきありがとうございます!

EDITは:IntegerFieldととして最後のフィールドを置き換え、今では

編集編集...昇順です:挑戦1,2,3,4が結合されると、それらはCharFieldsは後で整数に変換しています。だから、それはフィールドに入れられたIntegerだった。合計点がIntegerFieldに置き換えられた場合を除いて、リーダーボードは最初に空の順序を指定しています。

+2

あなたは確かtotalpointsは整数ですか? "70"、 "540"、 "200"が文字列で、辞書順にソートされている場合は、順序が正しくなります。そうでない場合は、コードを示す必要があります。 [mcve] –

+0

少し質問を変えて今すぐチェック – MatejMecka

答えて

1

あなたはコードを表示していないので、確かに言うのは難しいですが、数値文字列をソートする場合のように見えます。合計点データは数値ではなく、文字列です。

数字のように見える文字列のリストを並べ替えると、数字のような並べ替えが行われません。最初の桁が最も重要である、とソート順を決定します:あなたが数値としてそれらを並べ替える場合は

>>> sorted(['200', '70', '540'], reverse=True) 
['70', '540', '200'] 

を、彼らが正常に動作:

>>> sorted([200, 70, 540], reverse=True) 
[70, 200, 540] 
+1

良い目!この場合、OPはフィールドを「IntegerField」にするか、このトリックを使用する必要があります。https://stackoverflow.com/questions/8941962/ordering-query-result-by-numeric -strings-in-django-postgres-backend – slezica

1

totalpointsを整数ではなく文字列として保存する必要があります。これは、アルファベット順に番号が表示されていることを意味します(逆の意味で、-のため)。

totalpointsフィールドをIntegerFieldに保存すると、より良い結果が得られます。

関連する問題