Python Django';s通用视图:如何基于外部类属性筛选get_queryset?
我一直在学习Django初学者教程() 现在我决定做一些修改来测试我的技能 具体来说,我打算为结果视图通用视图实现一个自定义的获取查询集 大概是这样的:Python Django';s通用视图:如何基于外部类属性筛选get_queryset?,python,django,django-models,django-queryset,Python,Django,Django Models,Django Queryset,我一直在学习Django初学者教程() 现在我决定做一些修改来测试我的技能 具体来说,我打算为结果视图通用视图实现一个自定义的获取查询集 大概是这样的: # views.py class ResultsView(generic.DetailView): model = Question template_name = 'polls/results.html' def get_queryset(self): ''' Make sure we
# views.py
class ResultsView(generic.DetailView):
model = Question
template_name = 'polls/results.html'
def get_queryset(self):
'''
Make sure we are displaying results for choices which have 1+ votes
'''
return Question.objects.get ...
# Django shell
q = Question.objects.get(pk=1)
q.choice_set.filter(votes=1)
[<Choice: Not much>]
基本上,我的目标是只对至少有一票的选择返回问题的选择
所以我在Django的壳里试过这样的东西:
# views.py
class ResultsView(generic.DetailView):
model = Question
template_name = 'polls/results.html'
def get_queryset(self):
'''
Make sure we are displaying results for choices which have 1+ votes
'''
return Question.objects.get ...
# Django shell
q = Question.objects.get(pk=1)
q.choice_set.filter(votes=1)
[<Choice: Not much>]
#Django shell
q=Question.objects.get(pk=1)
q、 选择集过滤器(投票=1)
[]
在这里,我得到pk=1的问题,然后根据choice_集(choice model的fk指问题模型)进行过滤
我正试图弄清楚如何在我的views.py中实现这一点,以便它只返回1+票数的选项的问题内容(即选项)(即显示所有相关票数的选项,但票数为0的选项)
为了完整起见,这里是实际的模板(polls/results.html):
{{question.question_text}
{问题中的选项为%choice\u set.all%}
- {{choice.choice_text}--{{choice.voces}投票{{choice.voces | pluralize}
{#pluralize用于为0或2+choice.voces的值自动添加“s”
{%endfor%}
型号
# models.py
Class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
class Choice(models.Model):
question = models.ForeignKey(Question)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
#models.py
课堂提问(models.Model):
问题文本=models.CharField(最大长度=200)
发布日期=models.datetime字段(“发布日期”)
定义(自我):
返回self.question\u文本
def最近发布(自我):
now=时区。now()
return now-datetime.timedelta(days=1)我认为关系应该适合你
也许是这样的
def get_queryset(self):
return Question.objects.filter(choices__votes__gte=1)
编辑:
实际上,您希望重载get_对象。请参见此处get()和get_对象的定义:
具体来说,类似于:
pk = self.kwargs.get(self.pk_url_kwarg, None)
Choice.objects.filter(question__pk=pk, votes__gte=1)
您所做的有点奇怪,因为细节视图通常在一个对象上工作,但这应该可以工作。听起来是个不错的解决方案。但是,我遇到了这个错误“get()返回了多个问题--它返回了2!”如何返回(在get_queryset中)对视图应用的特定问题有1+个投票的选项?如果视图有问题PK(或类似的问题),您可以执行:Choice.objects.filter(问题PK=X,投票=1)。这取决于你的型号。如果你把它们贴出来,回答起来会更容易。我认为pk是隐含的。我刚刚用两个涉及的模型修改了我的问题。有什么线索吗?虽然效果与我想要的不完全一样(我想我会在模板级别实现它),但我最终使用distinct()解决了这个问题。问题是,当以1+票对每个选项执行查询时,相同的问题被返回到数组中。谢谢你的努力:)