Python Django模板多个表,仅包含轻微修改的数据
我想在我的页面上显示两个表,其中只有一列被修改,而所有其他列都是相同的。我想知道是否有其他方法比简单地循环两次并创建两次表更有效 我现在要做的是:Python Django模板多个表,仅包含轻微修改的数据,python,django,python-3.x,django-templates,Python,Django,Python 3.x,Django Templates,我想在我的页面上显示两个表,其中只有一列被修改,而所有其他列都是相同的。我想知道是否有其他方法比简单地循环两次并创建两次表更有效 我现在要做的是: # Example models class Question(models.Model): question = models.TextField() class Answer(models.Model): question = models.ForeignKey(Question) score = models.Inte
# 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
在我看来,我会将问题与答案联系起来,如下所示:
# Example view
questions = Question.objects.prefetch_related(Prefetch('answer_set', to_attr='answers')).all()
这意味着我的问题对象对于每个问题都是这样的
question.answers = [<Answer: Initial>, <Answer: Current>]
如您所见,这需要我使用for循环两次,每次检查scoretype是1还是2。有没有更有效的方法来实现这一点,或者这是一种可行的方法?我有很多问题,我希望工作尽可能有效率
提前谢谢 一个可能的解决方案是使用两个不同的查询集,
Answer.scoreType上的filter,即:
# 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
然后
#模板:
初分
{q的初始值为%}
{q.answers%中的答案为%s}
# ...
{%endfor%}
{%endfor%}
当前分数
{当前%%中q的百分比}
{q.answers%中的答案为%s}
# ...
{%endfor%}
{%endfor%}
但这意味着您将有两个db查询,这可能不是最优的(取决于您的数据集大小等)
另一种解决方案是在视图中手动过滤查询集,但如果您希望按问题排序查询集,这将变得很棘手,会消耗更多内存,并且可能最终比发出两个不同的查询慢(这里再次说明,这取决于您的数据集大小等)
因此,长话短说,“正确”的解决方案实际上取决于您的实际数据集,特别是视图中通常有多少问题/答案。如果这些是非常小的数据集,在视图中甚至直接在模板中进行过滤可能足够快,但是纯python代码或(更糟糕的)模板代码相对于SQL db内置过滤的相对性能将很快成为第一个选项(两个不同的查询)更快。这不会对数据库进行两次额外的查询,因为您正在查询集上使用筛选器吗?@AlexanderSchillemans是的,这就是我要提到的;)@AlexanderSchillemans引用了我编辑过的答案。为了完整性起见,请记住django QuerySet是懒惰的-只有在实际开始对数据库进行迭代时才访问它-因此您只需要额外的一个查询(=>总共有两个查询,而不是一个查询)。啊,我明白了。这确实比我现在使用的多了一个查询。感谢您的编辑,我猜多做一个查询比在模板中进行过滤更快。我会试试看。谢谢
Initial Scores
Question Score
Q1 2
Q2 3
Current Scores
Question Score
Q1 1
Q2 4
# 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 %}