在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()
比如:
将根据用户的平均分数对用户进行排序
我不经常使用ListView,如果您只使用标准视图,如:
在html中,您可以执行相同的操作:
相关问题 更多 >
编程相关推荐