Django模板多个表,只需稍微修改d

2024-09-22 14:24:24 发布

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

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

我现在要做的是:

# Example models
class Question(models.Model):
    question = models.TextField()

class Answer(models.Model):
    question = models.ForeignKey(Question)
    score = models.Integerfield()

    SCORETYPES = (
    (1, 'initial'),
    (2, 'current'),
    )

    scoreType = models.Integerfield(choices=SCORETYPES)

    def __str__(self):
        return "Answer: " + scoreType

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

^{pr2}$

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

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

如您所见,这需要我使用for循环两次,每次检查scoretype是1还是2。有没有更有效的方法来做这件事,还是这样做?我有很多问题,我想尽可能高效地工作。在

提前谢谢!在


Tags: 方法answerformodelmodelsexampleclassanswers
1条回答
网友
1楼 · 发布于 2024-09-22 14:24:24

一个可能的解决方案是使用两个不同的查询集,filterer on 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

那么

^{pr2}$

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

另一种解决方案是在视图中手动筛选出查询集,但是如果您想让查询集按问题排序,会占用更多内存,并且可能会比发出两个不同的查询慢(同样,取决于您的数据集大小等),这将开始变得棘手。

所以长话短说,“正确”的解决方案实际上取决于您的实际数据集—特别是您在一个视图中通常有多少问题/答案。如果这些是非常小的数据集,那么在视图中过滤或者直接在模板中过滤可能已经足够快了,但是纯python代码或者(更糟糕的)模板代码相对于sqldb内置过滤的相对性能将非常快地使第一个选项(两个不同的查询)更快。

相关问题 更多 >