Django按条件注释过滤

时间:2013-02-10 20:52:13

标签: django django-models django-orm

是否可以在Django中使用“条件”注释? 比方说,有以下模型

class Author(models.Model):
   name = models.CharField()

class Article(models.Model):
   title = models.CharField()
   published = models.BooleanField()

现在我想选择一些有限(过滤)的作者查询集,并使用总书数和已发布的书籍数来注释它们,供以后使用(比如在作者查询集上应用过滤器,或者对其进行排序)。像

这样的东西

Author.objects.filter(name__icontains = 'a').annotate(total_books = Count('books')).annotate(published_books = Count('books', <here published=true filter>))

无论如何这可能吗?

2 个答案:

答案 0 :(得分:1)

Django的ORM调用转换为SQL。如果无法使用SQL查询完成,通常意味着您也无法使用ORM执行此操作。您要求的是一个不同的where条款(除非我遗漏了某些内容或误解),需要不同的查询。这为您提供了两个选项:

  1. 运行2个不同的查询(使用不同的filter()参数)
  2. 如果这是一个你不想运行两次的“昂贵”查询,你只需从数据库中提取数据一次,然后用普通的python代码预先形成聚合。

答案 1 :(得分:0)

只是一个简单的想法,你可以试试:

Author.objects.filter(name__icontains = 'a').\
    annotate(total_books = Count('books')).\
    annotate(published_books = Count('books__published'))

由于BooleanField被写为0/1整数,因此它可以完成这项工作。或者它可能不是:)只需在你的代码中尝试。