如何使用Djang中与预取相关的函数过滤两个表的结果

2024-04-16 06:29:15 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的密码:

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

我正在按is_approved筛选问题,并希望在回答时也使用此筛选器。你知道吗

我也希望答案有个限制,即“2”。有什么帮助吗?我知道这是一个简单的问题,但我是django的新手。你知道吗

我的答案中也有相同的is_approved字段。你知道吗

我有问答表。答案表有一个问题id的外键。每个问题有多达个答案。我想获取所有有答案的问题,但只限于答案,即在一个查询中取2个。你知道吗


Tags: django答案answer密码objectsisfilterlist
1条回答
网友
1楼 · 发布于 2024-04-16 06:29:15

只需添加answer__is_appoved=1查找。别忘了向queryset添加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]

相关问题 更多 >