これは抽象的で単純化された例です。
著者を取得し、カテゴリ内の本の最小数が3を超える場合は、注釈を付けたいとします。
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で修正される予定です。これが今のところworkaruondです:
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))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加