Python Django';s通用视图:如何基于外部类属性筛选get_queryset?

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

我一直在学习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的壳里试过这样的东西:

# 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+票对每个选项执行查询时,相同的问题被返回到数组中。谢谢你的努力:)