2012-04-20 120 views
0

我試圖建立一個簡單的排名系統,我通過'Score'和'ID'命令主題。 我最初建,這是通過設置在SQL中「ROWNUM」變量並調用「排名」這樣的PHP:Django排名解決方案

public function rank() { 
    global $database; 
    $sql = "SET @rownum :=0"; 
    $database->query($sql); 
    $sql = "SELECT rank FROM ( 
     SELECT @rownum:[email protected]+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

您是否爲您的數據庫構建了Django模型?如果可以,你可以包括嗎?這通常是你的django模型中的方法.py – 2012-04-20 19:30:23

回答

0

extra方法可以完成。

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

我正在尋找它被兩個參數排序,然後找出索引主題結束的地方(由id) – Timmerop 2012-04-20 22:06:39

1

嘗試

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

退房Django Book: Chapter 5 Models

+0

因此,如果我需要找到在列表中的主題的位置是否比通過查詢集進行交互更好?我可以說'找到ID 4',它會吐出'22'嗎? – Timmerop 2012-04-22 00:40:14

0

試試這個:

someSubject = Subject.objects.get(name='someSubject') 
someSubject_rank = Subject.objects.filter(score__gt=someSubject.score).count()+1 
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 %}