构造QuerySet返回数据库中具有最高IntegerField值的五个对象的列表

时间:2019-09-12 03:46:32

标签: django django-queryset

我正在遵循Django官方教程并创建一个民意调查网站。我有以下model.py:

from django.db import models

class Question(models.Model):
    questionText = models.CharField(max_length = 100)
    pubDate = models.DateTimeField('published date')

    def __str__(self):
        return self.questionText

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choiceText = models.CharField(max_length = 200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choiceText

我希望主页显示对问题的投票最多的前5名,但正在努力构建适当的QuerySet以获得此结果。我唯一想做的是:

def index(request):
   questions = Question.objects.order_by(*question.choice_set.votes*) 
   #I left *question.choice_set.votes* like that because I'm not sure how to properly express that in code or if it is possible in this example

此外,给Question类提供类似returnMostVotedOn(numberOfQuestions)的方法还是使用正确的QuerySet方法会更好吗?预先感谢。

*如果任何人都可以想到一个更好的问题标题,请随时进行更改,我正在努力简要地定义我的问题。

2 个答案:

答案 0 :(得分:0)

您可以用总票数来注释每个问题,然后按该注释字段排序。您可以对查询集进行切片以获取前n个结果

from django.db.models import Sum
Question.objects.annotate(
    total_votes=Sum('choice__votes')
).order_by('-total_votes')[:5]

答案 1 :(得分:0)

我会这样做。它将在一个多对多字段中存储所有对某个特定问题进行投票的用户,然后只计算“投票”字段中有多少用户,并在5处将列表切掉。

模态

class Question(models.Model):
    questionText = models.CharField(max_length = 100)
    pubDate = models.DateTimeField('published date')
    votes = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True)

    def __str__(self):
        return self.questionText

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choiceText = models.CharField(max_length = 200)

观看次数

from django.db.models import Count    
obj = Question.objects.annotate(q_count=Count('votes')).order_by('-q_count')[:5]