0

「スコア」と「ID」で科目を並べ替える単純なランキングシステムを構築しようとしています。私はもともと、SQL で「rownum」変数を設定し、次のように「Rank」を呼び出すことで、これを PHP で構築しました。

public function rank() {
    global $database;
    $sql = "SET @rownum :=0";
    $database->query($sql);
    $sql = "SELECT rank FROM ( 
        SELECT @rownum:=@rownum+1 AS rank, id, score 
        FROM subjects
        ORDER BY score DESC, id ASC) AS derived_table 
        WHERE id = {$this->id}";

    $result_set = $database->query($sql);
    $row = $database->fetch_array($result_set);
    return array_shift($row);
    }

クエリセットからインデックスを作成することもできますが、その方法もわかりません。Djangoでこれを達成する方法について何か考えはありますか?

モデル:

class Subject(models.Model):
    def __unicode__(self):
        return self.name
    def __str__(self):
        return self.name

    name = models.CharField(max_length=40)
    score = models.IntegerField(default=0)
    created = models.DateTimeField(default=datetime.datetime.now)

前もって感謝します!

4

4 に答える 4

1

試す

order_by('score', 'pk') #pk is the ID or primary key

Django Book: Chapter 5 モデルをチェックしてください。

于 2012-04-21T16:25:15.937 に答える
0

追加のメソッドを使用すると、これを行うことができます。

Blog.objects.extra(
    select={
        'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id'
    },
)
于 2012-04-20T20:22:13.630 に答える
0

これを試して:

someSubject = Subject.objects.get(name='someSubject')
someSubject_rank = Subject.objects.filter(score__gt=someSubject.score).count()+1
于 2015-06-16T08:44:37.957 に答える
0

データを表示するだけで、各行のランク フィールドをそれ以上処理したくない場合は、Django のforloop.counterテンプレート変数を使用するシンプルでエレガントな方法があります。

# your views.py    
return (super(View, self).get_context_data(
        subjects=Subject.objects.order_by("-score", "pk"), 
        **kwargs)
)

# your template.html
{% for subject in subjects %}
    <tr>
        <td>{{ forloop.counter }}</td>
        <td>{{ subject.name }}</td>
        <td>{{ subject.score }}</td>
    </tr>
{% endfor %}
于 2016-08-10T21:23:09.563 に答える