为什么django中的.filter()会返回重复的对象?

Hyu*_*won 6 django

我已经按照django教程进入了tutorial05.

我试图不像教程所说的那样显示空轮询,所以我添加了这样的过滤条件:

class IndexView(generic.ListView):
    ...
    def get_queryset(self):
        return Question.objects.filter(
            pub_date__lte=timezone.now(),
            choice__isnull=False
        ).order_by('-pub_date')[:5]
Run Code Online (Sandbox Code Playgroud)

但是这返回了两个完全相同的对象.

我认为choice__isnull = False引起了问题,但不确定.

Vla*_*lov 13

choice__isnull导致问题.它导致与参加choice表(剔除掉questions没有choices),那是这样的:

SELECT question.*
  FROM question
  JOIN choice
    ON question.id = choice.question_id
 WHERE question.pub_date < NOW()
Run Code Online (Sandbox Code Playgroud)

你可以检查query属性QuerySet.所以如果你有question两个choices,那么你会得到question两次.distinct()在这种情况下你需要使用方法:queryset.distinct().

  • 默认情况下,查询集不会消除重复行。在实践中,这很少是一个问题,因为简单的查询(例如 Blog.objects.all())不会引入重复结果行的可能性。但是,如果您的查询跨越多个表,则在计算 QuerySet 时可能会获得重复的结果。这时候你就需要使用distinct()了。 (2认同)

Dee*_*hta 8

.distinct()只需在 ORM 末尾使用即可。