django - Django按子查询中注释的计数过滤
问题描述
这是一个抽象和简化的例子。
假设我想获取作者并在类别中注释最少数量的书籍,如果它大于三。
Book 和 Author 模型并没有与 ForeignKey 字段连接(记住,抽象和简化,这是有原因的):
Author(models.Model):
name = models.CharField(max_length=250)
Book(models.Model):
author_name = models.CharField(max_length=250)
book_category = models.CharField(max_length=250)
这是我可以重现的最简单的查询:
(Author.objects
.annotate(min_valuable_count=Subquery(
Book.objects
.filter(author_name=OuterRef('name'))
.annotate(cnt=Count('book_category'))
.filter(cnt__gt=3)
.order_by('cnt')
.values('cnt')[:1],
output_field=models.IntegerField()
))
)
我得到一个错误:
psycopg2.ProgrammingError: missing FROM-clause entry for table "U0"
LINE 1: ... "core_author" GROUP BY "core_author"."id", "U0"."id" ...
^
这是SQL:
SELECT "core_author"."id", "core_author"."name", (
SELECT COUNT(U0."book_category") AS "cnt"
FROM "core_book" U0 WHERE U0."id" = ("core_author"."chat_id")
GROUP BY U0."id" HAVING COUNT(U0."book_category") > 3
ORDER BY "cnt" ASC LIMIT 1)
AS "min_valuable_count"
FROM "core_author"
GROUP BY "core_author"."id", "U0"."id"
更新#1
我发现删除.filter(cnt__gt=3)
删除最后一个GROUP BY
无权访问U0
:
SELECT "core_author"."id", "core_author"."name", (
SELECT COUNT(U0."book_category") AS "cnt"
FROM "core_book" U0 WHERE U0."id" = ("core_author"."chat_id")
GROUP BY U0."id"
ORDER BY "cnt" ASC LIMIT 1)
AS "min_valuable_count"
FROM "core_author"
有没有办法GROUP BY
在外部查询中删除而不.filter(cnt__gt=3)
在子查询中删除?
解决方案
这是一个错误,它将在 django 版本 2.1.6 中修复。这是现在的工作:
min_valuable_count_qs = Subquery(
Book.objects
.filter(author_name=OuterRef('name'))
.annotate(cnt=Count('book_category'))
.filter(cnt__gt=3)
.order_by('cnt')
.values('cnt')[:1],
output_field=models.IntegerField()
)
min_valuable_count_qs.contains_aggregate = False
qs = Author.objects.annotate(min_valuable_count=min_valuable_count_qs))
推荐阅读
- javascript - 我在 python (Firefox webdriver) 中使用 selenium,而 driver.execute_script() 似乎没有返回任何东西
- javascript - 令人耳目一新的幻灯片
- java - 如何在 PDFBOX 中放置“勾号”符号?
- scala - 使用 '+=' 将数据插入 Scala 中的 Map 时是否有特定的规则或优先级?
- android - 更新 AndroidStudio(3.5.3) 未构建 Android 项目,原因是:org.gradle.api.resources.ResourceException:Unable to load Maven meta-data
- ruby - 在 macOS 上升级全局 Ruby 版本
- c++ - 为什么我在尝试模板时遇到 Visual Studio C++ 错误
- php - 如何重定向到 PHP 页面?
- laravel - 使用干预在laravel中上传多个文件
- javascript - 将参数从js传递给django