Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模板多个表,仅包含轻微修改的数据_Python_Django_Python 3.x_Django Templates - Fatal编程技术网

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 %}