Django排序解

Django排序解,django,ranking,rownum,Django,Ranking,Rownum,我正在尝试建立一个简单的排名系统,在这个系统中,我按照“分数”和“ID”对主题进行排序。 我最初是通过在SQL中设置一个“rownum”变量并调用该“Rank”来构建这是PHP的,如下所示: public function rank() { global $database; $sql = "SET @rownum :=0"; $database->query($sql); $sql = "SELECT rank FROM ( SELECT

我正在尝试建立一个简单的排名系统,在这个系统中,我按照“分数”和“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)
提前谢谢

用这种方法可以做到这一点

Blog.objects.extra(
    select={
        'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id'
    },
)
试一试

查看尝试以下操作:

someSubject = Subject.objects.get(name='someSubject')
someSubject_rank = Subject.objects.filter(score__gt=someSubject.score).count()+1

如果您只想显示数据,而不想以任何方式进一步处理每行的秩字段,那么有一种简单而优雅的方法可以使用Django:

#your views.py
返回(super(View,self)。获取上下文数据(
subjects=Subject.objects.order_by(“-score”,“pk”),
**kwargs)
)
#你的template.html
{主题中的主题为%}
{{forloop.counter}}
{{subject.name}
{{subject.score}
{%endfor%}

您为数据库构建了Django模型了吗?如果有的话,你能包括在内吗?这通常是django模型中的一种方法。pyI希望它通过两个参数进行排序,然后找出主题结束位置的索引(通过id),因此如果我需要找到主题在该列表中的位置,有没有比通过查询集进行交互更好的方法?我能说“找到ID 4”它会吐回“22”吗?
someSubject = Subject.objects.get(name='someSubject')
someSubject_rank = Subject.objects.filter(score__gt=someSubject.score).count()+1
# 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 %}