2014-01-07 4 views
1

В моем приложении Django у меня есть несколько большая коллекция моделей, упорядоченных по количеству раз, когда они завершили действие. Это лидер. Я хочу, чтобы люди, использующие мое приложение, увидели, в каком месте они находятся, и имена двух людей выше и двух человек под ними. Итак, мне нужно найти позицию соответствующего пользователя в этом наборе запросов, а затем найти двух пользователей выше и ниже него. Каков наиболее эффективный способ сделать это? Я рисую пробелы ...Django Get Range в Queryset

ответ

0

Вы можете отфильтровать объекты по счету, используя score__lt и score__gt.

class Participant(models.Model): 
    user = models.ForeignKey(User) 
    score = models.IntegerField() 

    def get_score_above_below(self, n): 
     try: 
      above = Participant.filter(score__lt=self.score).order_by('-score')[:n] 
     except ObjectDoesNotExist: 
      above = Participant.filter(score__lt=self.score).order_by('-score') 
     try: 
      below = Participant.filter(score__gt=self.score).order_by('-score')[:n] 
     except ObjectDoesNotExist: 
      below = Participant.filter(score__gt=self.score).order_by('-score') 

     entries = list(above) + [self] + list(below) 
     return [(part.user, part.score) for part in entries] 

Это возвращает список кортежей:

[('<username two places above>', score), 
('<username one place above>', score), 
('<instance username>', score), 
('<username one place below>', score), 
('<username two places below>', score)] 
+0

Я обновил ответ, случаи углу должны быть закрыты в настоящее время –