过滤相关模型django

时间:2017-02-05 19:35:45

标签: python django django-queryset

我正在构建示例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

如何从查询中查询相关模型?

3 个答案:

答案 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)