我们如何使用Django中的prefetch_related函数从两个表中过滤结果

时间:2015-01-29 11:43:16

标签: python django

这是我的代码:

question_list = Question.objects.filter(category=category, is_approved=1) \
                                .prefetch_related('answer_set')[:10]

我正在按is_approved过滤问题,并希望此过滤器也可以回答。

我还想要一个答案限制,即'2'。有帮助吗?我知道这是一个简单的问题,但我是django的新手。

我也有同样的is_approved字段。

我有问题表和答案表。答案表有一个外键question_id。每个问题都有答案。我想用答案来获取所有问题但是限制答案,即在单个查询中输入2个。

1 个答案:

答案 0 :(得分:0)

只需添加answer__is_appoved=1个查找。并且不要忘记将distinct()调用添加到查询集:

question_list = Question.objects.distinct() \
                        .filter(category=category, is_approved=1,
                                answer__is_approved=1) \
                        .prefetch_related('answer_set')[:10]

如果您想获得两个已批准答案的已批准问题列表,请使用Count注释:

from django.db.models import Count

question_list = Question.objects.distinct() \
                        .filter(category=category, is_approved=1,
                                answer__is_approved=1) \
                        .annotate(answer_cnt=Count('answer')) \
                        .filter(answer_cnt=2) \
                        .prefetch_related('answer_set')[:10]

但请注意prefetch_related()无论is_approved属性如何都会获取所有答案。所以你必须手动过滤:

for question in question_list:
    approved_answers = [answer for question.answer_set.all()
                               if answer.is_approved == 1]