在浏览Django tutorial时,我决定在第5部分中实施一些“更多测试的想法”,即
例如,可以在没有选择的网站上发布问题是愚蠢的。因此,我们的观点可以检查这一点,并排除这些问题。
我已在 views.py 中实施此检查,方法是更改IndexView.get_queryset
功能,如下所示
def get_queryset(self):
#Return the last five published questions with nonzero choice_set
result = [];
for q in Question.objects.all():
if q.choice_set.count() > 0:
result.append(q)
return sorted( result, key=attrgetter('pub_date'), reverse=True )[0:5]
有更优雅的方式吗?类似于return Question.objects.filter(choice_set.count()>0).order_by('-pub_date')[:5]
的东西(由于可能显而易见的原因不起作用)。
编辑1
另一个可能的答案是return Question.objects.filter(pk__in=[x.question.pk for x in Choice.objects.all()]).order_by('-pub_date')[:5]
(受this启发)。它仍然不允许单一选择排除问题,如@catavaran建议。
答案 0 :(得分:0)
您可以使用aggregation:
from django.db.models import Count
Question.objects.annotate(num_choices=Count('choice')) \
.filter(num_choices__gt=0).order_by('-pub_date')[:5]
事实上只有一个选择的民意调查也没有意义:-)所以最好使用filter(num_choices__gt=1)
代替filter(num_choices__gt=0)
。
答案 1 :(得分:0)
您可以排除choice=None
所有问题,并且在没有选择的情况下排除所有问题:
qs = Question.objects.exclude(choice=None).order_by'(-pub_date')[:5]
或者您可以使用choice__isnull=False
,但这可以返回重复的条目。使用.distinct()
来反击:
qs = Question.objects.filter(choice__isnull=False).distinct()