Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django按子查询内带注释的计数筛选_Django_Postgresql_Orm - Fatal编程技术网

Django按子查询内带注释的计数筛选

Django按子查询内带注释的计数筛选,django,postgresql,orm,Django,Postgresql,Orm,下面是一个抽象和简化的示例 假设我想要获得作者,并在类别中注释最小数量的书籍,如果它大于三本 书籍和作者模型与外键字段无关(记住,抽象和简化,这是有原因的): 下面是我可以复制的最简单的查询: (Author.objects .annotate(min_valuable_count=Subquery( Book.objects .filter(author_name=OuterRef('name')) .annotate(cnt=Count('book_

下面是一个抽象和简化的示例

假设我想要获得作者,并在类别中注释最小数量的书籍,如果它大于三本

书籍和作者模型与外键字段无关(记住,抽象和简化,这是有原因的):

下面是我可以复制的最简单的查询:

(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_ugt=3)
会删除无法访问
U0
的最后一个
groupby

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" 

是否有任何方法可以在不删除子查询中的
.filter(cnt_ugt=3)
的情况下删除外部查询中的
GROUP BY
。以下是目前的工作:

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