【问题标题】:Django filter by conditional annotationDjango通过条件注释过滤
【发布时间】:2013-02-10 20:52:12
【问题描述】:

在 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>))

这可能吗?

【问题讨论】:

  • 找到解决方案了吗?我也有类似的情况。我有附加到项目的文件,可以使用已删除的布尔字段删除文件。当我对文件进行注释以获取它们的状态时,它包括已删除的文件,即使文件对象管理器告诉 Django 忽略已删除的文件,除非指定。

标签: django django-models django-orm


【解决方案1】:

Django 的 ORM 调用转换为 SQL。如果不能用 SQL 查询来完成,通常意味着你也不能用 ORM 来完成。您要求的是不同的 where 子句(除非我遗漏了什么或误解),需要不同的查询。这为您提供了 2 个选择:

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

【讨论】:

  • 无法从我的手机编辑问题。无论如何,我希望它生成对文章表的左外连接有两个计数的 sql,其中一个条件为 published=true..
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-11-13
    • 1970-01-01
    • 2019-08-17
    • 2015-04-07
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多