很抱歉,如果这是重复的,但是我没有找到问题的答案。
我的下面的问题
在使用ListView时,我真的很难理解如何自定义视图。我阅读了Django文档,但我觉得它很简短。
我想做的是计算每个主题的问题,并返回问题最多的主题。我可以在models.py(主题类)中使用以下代码来计算每个主题的问题数量:
def questions_count(self):
return Question.objects.filter(question__topic = self).count()
但是,我只想返回最受欢迎的主题和问题数量。
使用基于函数的视图,我将遍历主题,并创建两个存储主题名称和问题数量的变量。但是,对于ListView,我不知道是否要使用get_context_data(),get_queryset()或其他方式。
我的视图类:
class TopicsView(ListView):
model = Topic
context_object_name = 'topics'
template_name = 'home.html'
我的模型:
class Topic(models.Model):
name = models.CharField(max_length=30, unique=True)
description = models.CharField(max_length=100)
class Question(models.Model):
....
topic = models.ForeignKey(Topic, related_name='questions', on_delete=models.CASCADE)
....
答案 0 :(得分:1)
您可能想尝试使用default_scope
来获取与每个.annotate()
关联的Questions
的数量:
Topic
每个from django.db.models import Count
topics_count = Topics.objects.annotate(count_of_questions=Count('question'))
对象将具有一个新属性Topic
,该属性是与每个count_of_questions
相关的问题总数。
在您的Topic
中:
ListView
然后,您应该可以使用dictsortreversed在模板中执行以下操作,应该应返回先的问题最多的主题:>
class TopicsView(ListView):
model = Topic
context_object_name = 'topics'
template_name = 'home.html'
def get_queryset(self):
queryset = super(TopicsView, self).get_queryset()
queryset = queryset.annotate(count_of_questions=Count('question'))
以下SO Q&A
中也有类似的问答答案 1 :(得分:0)
最后,我设法通过get_context_data()函数做到了这一点。这是我的解决方案的样子:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
mostQuestions = context['object_list'][0].questions_count()
mostQuestionsTopic = context['object_list'][0]
for topic in context['object_list']:
if topic.questions_count() > mostQuestions:
mostQuestions = topic.questions_count()
mostQuestionsTopic = topic
context['mostQuestions'] = mostQuestions
context['mostQuestionsTopic'] = mostQuestionsTopic
return context
有没有更有效的解决方案?