【问题标题】:Django ranking solutionDjango排名解决方案
【发布时间】:2012-04-20 16:05:43
【问题描述】:

我正在尝试构建一个简单的排名系统,在该系统中我按“分数”和“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);
    }

我可以从 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)

提前致谢!

【问题讨论】:

  • 您是否已经为您的数据库构建了 Django 模型?如果是这样,你可以包括吗?这通常是您的 django model.py 中的方法

标签: django ranking rownum


【解决方案1】:

试试

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

查看Django Book: Chapter 5 Models

【讨论】:

  • 那么如果我需要在该列表中查找主题的位置,有没有比通过查询集进行交互更好的方法?我可以说“找到 ID 4”,它会吐回“22”吗?
【解决方案2】:

使用extra 方法可以做到这一点。

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

【讨论】:

  • 我正在寻找它按两个参数排序,然后找出主题结束位置的索引(按 id)
【解决方案3】:

试试这个:

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

【讨论】:

    【解决方案4】:

    如果您只想显示数据而不是进一步处理每一行的排名字段,那么使用 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 %}
    

    【讨论】:

      猜你喜欢
      • 2013-09-26
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多