我正在尝试构建一个简单的排名系统,我按“分数”然后按“ID”命令主题。 我最初构建这是PHP,在SQL中设置'rownum'变量并像这样调用'Rank':
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);
}
我可以从Queryset索引它,但我还没弄明白如何做到这一点。 关于如何在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)
提前感谢!
答案 0 :(得分:1)
答案 1 :(得分:0)
使用extra方法可以完成此操作。
Blog.objects.extra(
select={
'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id'
},
)
答案 2 :(得分:0)
试试这个:
someSubject = Subject.objects.get(name='someSubject')
someSubject_rank = Subject.objects.filter(score__gt=someSubject.score).count()+1
答案 3 :(得分:0)
如果你只想显示数据而不是以任何方式处理每一行的排名字段,那么使用Django的forloop.counter
template variable是简单而优雅的方式:
# 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 %}