Django模板多个表只有略微修改过的数据

时间:2018-05-18 09:30:30

标签: python django python-3.x django-templates

我想在我的页面上显示两个表,其中只有一列被修改而所有其他列都相同。我想知道是否有其他方法比简单循环两次并创建表两次更有效?

我现在要做的是:

# Example view
questions = Question.objects.prefetch_related(Prefetch('answer_set', to_attr='answers')).all()

在我看来,我会将问题与答案联系起来:

question.answers = [<Answer: Initial>, <Answer: Current>]

这意味着我的问题对象对于每个问题都是这样的

# Example template
{% for question in questions %}
    {% for answer in question.answers %}
        <p>{{ answer.scoreType }}: {{ answer.score }}</p>
    {% endfor %}
{% endfor %}

然后在我的模板中我会像这样打印它们

Initial Scores

Question    Score
Q1          2
Q2          3

Current Scores

Question    Score
Q1          1
Q2          4

这样可行但现在我想为所有初始分数创建一个表,并为所有当前分数创建一个表,这样你就得到这样的结果:

{{1}}

正如您所看到的,这将要求我使用for循环两次,并且每次检查得分类型是1还是2.是否有更有效的方法来执行此操作或这是要走的路?我有很多问题,我希望尽可能高效地工作。

提前致谢!

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是使用两个不同的查询集,Answer.scoreType上的过滤器,即:

# views

def myview(request, ...):
    qs = Question.objects.prefetch_related(Prefetch('answer_set', to_attr='answers'))
    initial = qs.filter(answer__scoreType=1)
    current = qs.filter(answer_scoreType=2)
    context = {"initial": initial, "current": current)
    # etc

然后

# template:

<h1>Initial scores</h1>
{% for q in initial %}
   {% for answer in q.answers %}
    # ...
   {% endfor %}
{% endfor %}

<h1>Current scores</h1>
{% for q in current %}
   {% for answer in q.answers %}
    # ...
   {% endfor %}
{% endfor %}

但这意味着您将有两个数据库查询,这些查询可能也不是最佳的(取决于您的数据集大小等)。

另一个解决方案是在视图中手动过滤掉你的查询集,但是如果你想让你的查询集按顺序排序,会占用更多的内存,并且可能最终比发出两个不同的内容更慢,这将开始变得棘手查询(这里再次,取决于您的数据集大小等)。

总而言之,“正确”的解决方案实际上取决于您的实际数据集 - 特别是您在视图中通常有多少问题/答案。如果这些是非常小的数据集,在视图中甚至直接在模板中进行过滤可能足够快,但纯python代码的相对性能或(更糟糕的)模板代码VS您的SQL db内置过滤将很快成为第一个选项( 2个不同的查询)更快。