我正在构建示例django民意调查应用程序。我想排除所有没有选择的民意调查。为此,我必须访问相关的选择对象:
return Question.objects.filter(
pub_date__lte=timezone.now()
).exclude(
choice_set__count=0
).order_by('-pub_date')[:5]
但是此查询会导致字段错误:
无法解析关键字' choice_set'进入田野。选择包括:choice,id,pub_date,question_text
如何从查询中查询相关模型?
答案 0 :(得分:2)
要过滤相关模型,只需使用小写模型名称 - 您可以看到choice
是可用字段之一。
然而,这仍然没有成功;没有__count
属性可以过滤。您可以使用注释添加一个,但有一种更简单的方法:与None
进行比较:
.exclude(choice=None)
答案 1 :(得分:1)
在Choice
模型中,将related_name
设置为Question
外键。
例如:
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE, related_name='choices')
# other code..
然后你的查询应该是这样的:
return (Question.objects
.filter(pub_date__lte=timezone.now(),
choices__isnull=False)
.order_by('-pub_date')[:5])
注意:没有“__count”查找。如果您想依赖计数,请查看docs on this。
docs:https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ForeignKey.related_name
答案 2 :(得分:0)
_set
仅在您使用它来检索查询集之外的相关模型时才适用,相反,如错误所示,您只需使用choice
.exclude(choice__isnull=True)