Django 的通用视图:如何根据外部 class 属性过滤 get_queryset?
Django's Generic Views: how to filter get_queryset based on foreign class attributes?
我一直在关注 Django 入门教程 (https://docs.djangoproject.com/en/1.8/intro/tutorial05/)
我决定进行一些修改以测试我现在的技能。
具体来说,我打算为 ResultsView 通用视图实施自定义 get_queryset。
像这样:
# 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 ...
基本上我的目标是 return 仅针对 至少 1 票 .
的选项的选项
所以我在 Django 的 shell 中试过这样的东西:
# Django shell
q = Question.objects.get(pk=1)
q.choice_set.filter(votes=1)
[<Choice: Not much>]
这里我得到pk = 1的问题,然后根据choice_set(选择模型,其fk指的是问题模型)进行过滤。
我正在尝试弄清楚如何在我的 views.py 中实现它,以便 returns 问题的内容(即选择)仅针对获得 1+ 票的选项(即显示所有具有相关票数但具有 0 票的选项)。
为了完整起见,这里是实际模板 (polls/results.html):
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li> {# pluralize used to automatically add "s" for values with 0 or 2+ choice.votes #}
{% endfor %}
</ul>
<a href="{% url 'polls:detail' question.id %}">Vote again?</a>
型号
# 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
我觉得__关系应该做你。
也许是这样的?
def get_queryset(self):
return Question.objects.filter(choices__votes__gte=1)
编辑:
您实际上想要超载 get_object。在此处查看 get() 和 get_object 的定义:https://ccbv.co.uk/projects/Django/1.8/django.views.generic.detail/DetailView/
具体来说,类似于:
pk = self.kwargs.get(self.pk_url_kwarg, None)
Choice.objects.filter(question__pk=pk, votes__gte=1)
您所做的有点奇怪,因为详细视图通常适用于一个对象,但这应该有效。
我一直在关注 Django 入门教程 (https://docs.djangoproject.com/en/1.8/intro/tutorial05/)
我决定进行一些修改以测试我现在的技能。
具体来说,我打算为 ResultsView 通用视图实施自定义 get_queryset。
像这样:
# 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 ...
基本上我的目标是 return 仅针对 至少 1 票 .
的选项的选项所以我在 Django 的 shell 中试过这样的东西:
# Django shell
q = Question.objects.get(pk=1)
q.choice_set.filter(votes=1)
[<Choice: Not much>]
这里我得到pk = 1的问题,然后根据choice_set(选择模型,其fk指的是问题模型)进行过滤。
我正在尝试弄清楚如何在我的 views.py 中实现它,以便 returns 问题的内容(即选择)仅针对获得 1+ 票的选项(即显示所有具有相关票数但具有 0 票的选项)。
为了完整起见,这里是实际模板 (polls/results.html):
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li> {# pluralize used to automatically add "s" for values with 0 or 2+ choice.votes #}
{% endfor %}
</ul>
<a href="{% url 'polls:detail' question.id %}">Vote again?</a>
型号
# 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
我觉得__关系应该做你。
也许是这样的?
def get_queryset(self):
return Question.objects.filter(choices__votes__gte=1)
编辑:
您实际上想要超载 get_object。在此处查看 get() 和 get_object 的定义:https://ccbv.co.uk/projects/Django/1.8/django.views.generic.detail/DetailView/
具体来说,类似于:
pk = self.kwargs.get(self.pk_url_kwarg, None)
Choice.objects.filter(question__pk=pk, votes__gte=1)
您所做的有点奇怪,因为详细视图通常适用于一个对象,但这应该有效。