QuerySet在模板中是惰性的

时间:2019-11-11 05:16:41

标签: django django-templates django-queryset

我正在一个问答网站上工作。我认为我对代码一团糟。我仅在需要一个对象时才发送查询集所有对象。

就像在只需要一个问题时发送一个问题的所有答案。 我只打印一张。

那么,那会影响数据库的所有记录还是仅影响我将在模板中打印的记录?

View.py

questions = Question.objects.all()
context = {
    'questions':questions
}
return render(request,'index.html',context=context)

template_tag.py

@register.simple_tag
def getmostvotedanswer(answers):
    answer = answers.order_by('-vote')[0]
    return answer.answer 

index.html

  <p>{% getmostvotedanswer question.answer_set.all %}</p>

在这种情况下,我将发送所有答案,但只需要这样做,所以 这会影响数据库的性能吗?

问题模型

class Question(models.Model):
    question = models.CharField(max_length=400)
    uid = models.ForeignKey("User",on_delete=models.SET_DEFAULT,default=1,related_name='user_q_id_set')
    vote = models.IntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    catitle = models.ForeignKey("Category", on_delete=models.CASCADE)
    editUser = models.ManyToManyField("User",related_name='user_q_edit_set',null=True,blank=True)

答案模型

class Answer(models.Model):

    answer = models.TextField()
    qid = models.ManyToManyField("Question")
    uid = models.ForeignKey("User",on_delete=models.CASCADE,related_name='user_a_id_set')
    vote = models.IntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    editUser = models.ManyToManyField("User",related_name='user_a_edit_set',null=True,blank=True)

1 个答案:

答案 0 :(得分:0)

在模板中,您要遍历所有问题,将全部答案传递给自定义模板标签,并找到投票最多的一个。

如果这就是您想要的,您可以像这样简单地将排序放入答案模型中:

class Answer(models.Model):
    vote = models.IntegerField(default=0)
    # ...

    class Meta:
        ordering = ['-vote']

这样,当您致电question.answer_set时,它将自动按vote字段对答案进行排序。

因此您可以说question.answer_set.first来获得投票最高的答案。