Django将投票分为已回答和未回答

brccelvz  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(104)

好的,我有两个模型,“问题”和“答案”。当然,答案有外键“user”和“question”。所有民意调查的名单工作得很好,但现在我试图通过两个名单内的民意调查:“回答”和“未回答”,这样我就可以在两个表中列出民意调查,用户就可以看到他剩下的民意调查了。
基本上,我使用了一个简单的for循环,它只正确传递回答的问题,而不会传递未回答的问题。我很想知道为什么,也许我可以用不同的方式来处理它。
以下是我所做的:

def polls_view(request):
    polls = polls.objects.all()
    answers = answers.objects.filter(user=request.user)
    answered = []
    unanswered =[]
    
    for answer in answers:
        if answer.poll in polls:
            answered.append(answer.poll)
    
    for poll in polls:
        if poll not in answered:
            unanswered.append(poll)

字符串
另外,添加print(answered)和print(unanswered)可以在两个列表中显示轮询类型对象的列表,并且“answered”在django模板中完美地工作,但unanswered不在那里:

{% if not unanswered %}
test
{% endif %}


渲染时显示“test”。

dbf7pr2w

dbf7pr2w1#

假设Answer模型与poll有关系,你可以通过Poll来思考答案为“answered”:

# Annotate each poll with the count of related answers by the current user
polls = Poll.objects.annotate(num_answers=Count(
'answer', filter=Q(answer__user=request.user)))

# each poll that has the `num_answer` greater than zero
answered = polls.filter(num_answer__gt=0)

# and each poll that has the `num_answer` equal zero (unanswered)
unanswered = polls.filter(num_answer=0)

字符串
在这段代码中,我们使用Django的annotate()函数为每个投票添加一个新的“字段”,该字段是当前用户相关答案的计数。然后,我们将投票过滤为两个独立的查询集:已回答包含具有一个或多个相关答案的轮询,而未回答包含没有相关答案的轮询。看看Django的聚合函数会很好:https://docs.djangoproject.com/en/4.2/topics/db/aggregation/
有人注意到:

  1. answeredunanswered是查询集而不是列表,但是如果你想使用list(aswered),你可以将其作为列表来评估。
    1.每个Poll模型对象将有一个额外的num_answers字段。
    1.上面的代码使用了answer_set。如果您已经更改了外键中的相关名称,则需要相应地进行调整。

相关问题