查询集在模板中是惰性的
QuerySets are lazy in template
我正在做一个问答 website.I 觉得我搞砸了 code.I 我正在发送查询集所有对象,而只需要一个对象。
就像在只需要一个问题时发送一个问题的所有答案一样。
我只打印一个。
那么到时候会影响数据库的所有记录还是只影响我在模板中打印的记录?
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)
在您的模板中,您正在遍历问题,将所有答案传递给您的自定义模板标签,并找到得票最多的答案。
如果这是您想要的,您可以像这样简单地将排序放入您的答案模型中:
class Answer(models.Model):
vote = models.IntegerField(default=0)
# ...
class Meta:
ordering = ['-vote']
这样,当您调用 question.answer_set
时,它会自动按 vote
字段对答案进行排序。
所以你可以说 question.answer_set.first
以获得最高投票答案。
我正在做一个问答 website.I 觉得我搞砸了 code.I 我正在发送查询集所有对象,而只需要一个对象。
就像在只需要一个问题时发送一个问题的所有答案一样。 我只打印一个。
那么到时候会影响数据库的所有记录还是只影响我在模板中打印的记录?
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)
在您的模板中,您正在遍历问题,将所有答案传递给您的自定义模板标签,并找到得票最多的答案。
如果这是您想要的,您可以像这样简单地将排序放入您的答案模型中:
class Answer(models.Model):
vote = models.IntegerField(default=0)
# ...
class Meta:
ordering = ['-vote']
这样,当您调用 question.answer_set
时,它会自动按 vote
字段对答案进行排序。
所以你可以说 question.answer_set.first
以获得最高投票答案。