Django:对模型上方法的给定结果进行排序

2024-05-14 09:39:58 发布

您现在位置:Python中文网/ 问答频道 /正文

在Django中,如何对模型上的方法结果进行排序

class Flashcard(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    deck = models.ForeignKey(Deck, on_delete=models.CASCADE)
    question = models.TextField()
    answer = models.TextField()
    difficulty = models.FloatField(default=2.5)

    objects = FlashcardManager()

    def __str__(self):
        return self.question

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE,related_name='profile')
    bio = models.TextField(max_length=500,null=True, default='',blank=True)

    def __str__(self):
        return f'{self.user.username} Profile'

    def avg_diff_user(self):
        avg_diff = Flashcard.objects.filter(owner = self.user).aggregate(Avg('difficulty'))['difficulty__avg']
        return avg_diff

因此,通过avg_diff_user,我得到了每个用户的平均难度评分。然后我可以在我的排行榜模板中使用它,如下所示:

<ol>
   {% for user in leaderboard_list %}
   <li>{{user.username}}:  {{user.profile.avg_diff_user|floatformat:2}}</li>
   {% endfor %}
 </ol>

结果显示,但它没有排序-我如何按avg_diff_user排序?我读过很多类似的问题,但都没有用。我在我的模型上尝试了不同的方法:

def avg_diff_sorted(self):
    avg_diff_sorted = Flashcard.objects.all().annotate(get_avg_diff_user=Avg(Flashcard('difficulty'))['difficulty__avg'].order_by(get_avg_diff_user))
    return avg_diff_sorted

我认为这是不对的,在我的模板中没有返回任何结果。我还尝试了以下方法,正如在https://stackoverflow.com/a/930894/13290801中所建议的,但对我来说不起作用:

def avg_diff_sorted(self):
        avg_diff_sorted = sorted(Flashcard.objects.all(), key = lambda p: p.avg_diff)
        return avg_diff_sorted

我的看法:

class LeaderboardView(ListView):
    model = User
    template_name = 'accounts/leaderboard.html'
    context_object_name = 'leaderboard_list'

    def get_queryset(self):
        return self.model.objects.all()

Tags: 方法selfreturnobjects排序modelsdefdiff
1条回答
网友
1楼 · 发布于 2024-05-14 09:39:58

比如:

leaderboard_list = User.objects.all().annotate(avg_score=Avg('flashcard__difficulty').order_by('-avg_score')

将根据用户的平均分数对用户进行排序

我不经常使用ListView,如果您只使用标准视图,如:

def LeaderboardView(request):
    leaderboard_list = ...
    context = {'leaderboard_list':leaderboard_list}
    return render(request, 'accounts/leaderboard.html', context)

在html中,您可以执行相同的操作:

{% for user in leaderboard_list %}
...
{% endfor %}

相关问题 更多 >

    热门问题