Django条件注释过滤器

Django条件注释过滤器,django,django-models,django-orm,Django,Django Models,Django Orm,有可能在Django中有“条件”注释吗? 比如说,有以下几种模式 class Author(models.Model): name = models.CharField() class Article(models.Model): title = models.CharField() published = models.BooleanField() 现在,我想选择一些有限的(过滤的)作者查询集,并用总图书数量和已出版图书数量对它们进行注释,以供以后使用(如对作者查询集应用

有可能在Django中有“条件”注释吗? 比如说,有以下几种模式

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

class Article(models.Model):
   title = models.CharField()
   published = models.BooleanField()
现在,我想选择一些有限的(过滤的)作者查询集,并用总图书数量和已出版图书数量对它们进行注释,以供以后使用(如对作者查询集应用过滤器,或对其排序)。差不多

Author.objects.filter(name\u icontains='a')。注释(total\u books=Count('books'))。注释(published\u books=Count('books'))


无论如何,这是可能的吗?

Django的ORM调用转换成SQL。如果不能用SQL查询来完成,通常意味着不能用ORM来完成。您请求的是一个不同的
where
子句(除非我遗漏了什么或误解),需要不同的查询。这给您留下了两个选项:

  • 运行2个不同的查询(使用不同的
    filter()
    参数)
  • 如果这是一个不想运行两次的“昂贵”查询,那么只需从数据库中提取一次数据,并在普通python代码中预执行聚合即可

  • 简单一点,您可以尝试:

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

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

    无法从我的手机编辑问题。不管怎样,我希望它生成sql,在articles表的左侧外部联接上有两个计数,其中一个的条件published=true。找到解决方案了吗?我也有类似的情况。我有附加到项目的文件,可以使用删除的布尔字段删除这些文件。当我对文件进行注释以获取其状态时,它包括已删除的文件,即使文件对象管理器告诉Django忽略已删除的文件,除非指定。