我正在遵循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
方法会更好吗?预先感谢。
*如果任何人都可以想到一个更好的问题标题,请随时进行更改,我正在努力简要地定义我的问题。
答案 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]