如何在Django中计算和比较

时间:2017-03-14 19:31:28

标签: python django

目前有一个包含10个问题的数据库,这些问题从1-4发布一个数字我只想添加该数字以创建总数然后只显示该总数的最接近匹配 的 Models.py

class Question(models.Model):
name = models.CharField(max_length=10, primary_key=True)
question1 = models.CharField(max_length=50, choices=Question1_CHOICES)
question2 = models.CharField(max_length=50, choices=Question2_CHOICES)
question3 = models.CharField(max_length=50, choices=Question3_CHOICES)
question4 = models.CharField(max_length=50, choices=Question4_CHOICES)
question5 = models.CharField(max_length=50, choices=Question5_CHOICES)
question6 = models.CharField(max_length=50, choices=Question6_CHOICES)
question7 = models.CharField(max_length=50, choices=Question7_CHOICES)
question8 = models.CharField(max_length=50, choices=Question8_CHOICES)
question9 = models.CharField(max_length=50, choices=Question9_CHOICES)
question10 = models.CharField(max_length=50, choices=Question10_CHOICES)

Views.py

def comparison(request):
    return render(request, 'music/compare.html', dict(rows=Question.objects.all(), total=Question.objects.count()))

我尝试使用总计数,但我不认为它是正确的。 附加数据库布局的副本here

修改 - 添加了compare.html

    {% extends 'music/index.html' %}
{% block body %}

<body>
    <table>
    <table>
    <th>
    <tr>
    <table border="3">
        {% for row in rows %}
    <td><strong>Name</strong></td>
    <td>Question 1 </td>
    <td>Question 2 </td>
    <td>Question 3 </td>
    <td>Question 4 </td>
    <td>Question 5 </td>
    <td>Question 6 </td>
    <td>Question 7 </td>
    <td>Question 8 </td>
    <td>Question 9 </td>
    <td>Question 10 </td>
    <td>Total </td>
  </tr>
  </th>

  <tr>
    <td>{{row.name}} </td>
    <td>{{row.question1}} </td>
    <td>{{row.question2}} </td>
    <td>{{row.question3}} </td>
    <td>{{row.question4}} </td>
    <td>{{row.question5}} </td>
    <td>{{row.question6}} </td>
    <td>{{row.question7}} </td>
    <td>{{row.question8}} </td>
    <td>{{row.question9}} </td>
    <td>{{row.question10}} </td>
    <td>{{ question.s }} </td>
  </tr>
     </tr>
    {% endfor %}
    </table>
    </body>
{%endblock%

}

1 个答案:

答案 0 :(得分:1)

如果您希望每行Question1Question10的总和,请执行以下操作:

from django.db.models import F

questions = Question.objects.annotate(s=F('question1') + F('question2') + F('question3') + F('question4') + F('question5') + F('question6') + F('question7') + F('question8') + F('question9') + F('question10'))

这将产生x个等于行数的结果。 然后你可以这样做:

for question in questions:
    print(question.s)  # prints the sum of Question1 - Question10

或者,如果您只想要值(不是Question个对象),那么:

sums = Question.objects.annotate(s=F('question1') + F('question2') + F('question3') + F('question4') + F('question5') + F('question6') + F('question7') + F('question8') + F('question9') + F('question10')).values('s')

[更新]:您似乎没有正确循环questions QuerySet

以下是您需要做的事情:

你的views.py中的

就像这样:

questions = Question.objects.annotate(s=F('question1') + F('question2') + F('question3') + F('question4') + F('question5') + F('question6') + F('question7') + F('question8') + F('question9') + F('question10'))

...

return render(request, 'music/compare.html', {'questions': questions})

然后在你的HTML中就像这样:

{% for question in questions %}
    <td>Question 1 </td>
    ...
    <td>{{question.name}} </td>
    ...
    <td>{{ question.s }} </td>

修改2 - 更改了views.py

def compare():
    questions = Question.objects.annotate(
        s=F('question1') + F('question2') + F('question3') + F('question4') + F('question5') + F('question6') + F(
            'question7') + F('question8') + F('question9') + F('question10'))

    ...

    return render(request, 'music/compare.html', {'questions': questions})

compare.html

{% for question in questions %}
    <td>Question 1 </td>
    ...
    <td>{{question.name}} </td>
    ...
    <td>{{ question.s }} </td>

{%endfor%}
</body>