Django 通过条件注解过滤

标签 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>))

这有可能吗?

最佳答案

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

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

关于Django 通过条件注解过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14802439/

相关文章:

python - Django Select Option 选中问题

Django:CSRF验证失败

python - Django 模板如何循环遍历模型的行

python - Django — 提高 `startswith` 性能

Django:强制选择相关?

django - 合并两个 Django 查询集而不改变顺序

python - Django QuerySet values_list 返回未知字符

python - Django - 模型内的函数。如何从 View 中调用它?

django - 如何在 Django 管理面板中获取当前登录的用户 ID?

python - 如何将多对多关系转换为查询集?