Django教程中的额外功劳

时间:2015-01-22 11:54:24

标签: python django

在浏览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建议。

2 个答案:

答案 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()