QuerySets ленивы в шаблоне - PullRequest
       47

QuerySets ленивы в шаблоне

0 голосов
/ 11 ноября 2019

Я работаю над одним сайтом с вопросами и ответами. Я думаю, что у меня есть проблемы с кодом. Я отправляю наборы запросов всех объектов, когда нужен только один.

Как отправка всех ответов на один вопрос, когда нужен только один. Я печатаю только одну.

Так что в это время это повлияет на все записи базы данных или только на записи, которые я буду печатать в шаблоне?

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 голосов
/ 11 ноября 2019

В своих шаблонах вы перебираете вопросы, передавая все ответы на свой пользовательский тег шаблона и находите тот, который набрал наибольшее количество голосов.

Если вы этого хотите, выможно просто упорядочить модель ваших ответов следующим образом:

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

    class Meta:
        ordering = ['-vote']

Таким образом, когда вы звоните question.answer_set, он автоматически сортирует ответы по полю vote.

ТакВы можете сказать question.answer_set.first, чтобы получить лучший ответ.

...