2012-04-20 2 views
0

Я пытаюсь создать простую систему ранжирования, где я заказываю предметы по «Оценка», а затем по «ID». Первоначально я построил это PHP, установив «RowNum» переменной в SQL и называя это «Ранг», как это:Решение для ранжирования 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 –

ответ

0

Метод extra это можно сделать.

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

Я ищу, чтобы она сортировалась по двум параметрам, а затем, чтобы узнать индекс, где бы ни был объект (по id) – Timmerop

1

Попробуйте

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

Заканчивать Django Book: Chapter 5 Models

+0

Так что, если мне нужно найти положение субъекта в этом списке есть лучший способ, чем взаимодействие через набор запросов? Могу ли я сказать «найти ID 4», и он вернул бы «22»? – Timmerop

0

Попробуйте это:

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

Если вы просто хотите, чтобы отобразить данные, а не обрабатывать ранг поля каждой строки в любом случае, есть простой и, следовательно, элегантный способ использования Django's 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 %} 
Смежные вопросы