如何从QuerySet中获得我的位置

时间:2013-09-28 20:27:46

标签: python django django-queryset

对于有游戏化的项目,我认为我有一个非常常见的任务。

例如,您拥有存储所有用户解决方案的模型,并且每个解决方案都有分数

class Solutions(models.Model):
    text = models.TextField()
    score = models.IntegerField()
    for_top = models.BooleanField()

    def get_place(self):
        return list(Solutions.objects.filter(for_top=True)).index(self) + 1

有没有办法为方法get_place找到更优化的解决方案?

1 个答案:

答案 0 :(得分:0)

next(i for i, x in enumerate(Solutions.objects.filter(for_top=True), 1) if x is self)

基本上这使用两个优化。 next(iterable)代替list(iterable).index是显而易见的:next不是将所有内容存储在内存中,而是遍历并返回第一项。因此它会短路并且不会占用内存。

此外,它使用is代替==,这是一种更快的操作。