サブクエリ内で注釈が付けられたカウントによるDjangoフィルター

ダニイル・ザイキン

これは抽象的で単純化された例です。

著者を取得し、カテゴリ内の本の最小数が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]

編集
0

コメントを追加

0

関連記事

分類Dev

Django:カウントにフィルターで注釈を付ける

分類Dev

Django 1.10.7 ORMは、多対多のフィールドにわたる条件付きカウントでクエリに注釈を付けます

分類Dev

Django-サブクエリから複数のフィールドに注釈を付ける

分類Dev

Django-サブクエリから複数のフィールドに注釈を付ける

分類Dev

複数のフィールドを使用してカウントでDjangoクエリセットに注釈を付ける

分類Dev

サブクエリを使用してカウントに注釈を付ける

分類Dev

フィルタリングされたグループでユーザーオブジェクトに注釈を付ける

分類Dev

DjangoJSONFieldフィルタリングクエリセット。フィルター値は合計値に注釈が付けられます。

分類Dev

Djangoクエリ-注釈付きカウントフィルターで親オブジェクトを取得します

分類Dev

プリフェッチされたサブクエリの関数でdjangoクエリセットに注釈を付ける方法

分類Dev

プリフェッチされたサブクエリの関数でdjangoクエリセットに注釈を付ける方法

分類Dev

Djangoのフィールド値の対数でクエリセットに注釈を付ける

分類Dev

ManyToManyリレーションからのブール値でクエリセットに注釈を付ける

分類Dev

別の「フィルター」クエリセットのオブジェクトでクエリセットに注釈を付ける

分類Dev

django選択したクエリ値のカウントに注釈を付ける方法

分類Dev

カウントにDjangoクエリセットの条件で注釈を付ける方法

分類Dev

Djangoは個別のフィールドでカウントに注釈を付けます

分類Dev

DjangoORM最適化-カウントによる注釈と注釈フィルターの最後のエントリ

分類Dev

注釈が付けられているフィールドのタイプに基づいてコンパイル時エラーを生成できますか

分類Dev

Django:フィルタリングされた逆の関係に注釈を付ける

分類Dev

フィルタリングされた結合からの最新の値でQuerySetに注釈を付けます

分類Dev

フィールドに注釈が付けられている場合はコンストラクターを保持

分類Dev

Django 1.11サブクエリ集合に注釈を付ける

分類Dev

Django 1.11サブクエリ集合に注釈を付ける

分類Dev

Django 1.11サブクエリ集合に注釈を付ける

分類Dev

Django-クエリ:関連するモデルフィールドでクエリセットに注釈を付ける

分類Dev

注釈付きのDjangoクエリセット、なぜGROUP BYがすべてのフィールドに適用されるのですか?

分類Dev

Djangoクエリセット。1つのクエリでさまざまなフィールドに注釈を付ける

分類Dev

Djangoクエリセット。1つのクエリでさまざまなフィールドに注釈を付ける

Related 関連記事

  1. 1

    Django:カウントにフィルターで注釈を付ける

  2. 2

    Django 1.10.7 ORMは、多対多のフィールドにわたる条件付きカウントでクエリに注釈を付けます

  3. 3

    Django-サブクエリから複数のフィールドに注釈を付ける

  4. 4

    Django-サブクエリから複数のフィールドに注釈を付ける

  5. 5

    複数のフィールドを使用してカウントでDjangoクエリセットに注釈を付ける

  6. 6

    サブクエリを使用してカウントに注釈を付ける

  7. 7

    フィルタリングされたグループでユーザーオブジェクトに注釈を付ける

  8. 8

    DjangoJSONFieldフィルタリングクエリセット。フィルター値は合計値に注釈が付けられます。

  9. 9

    Djangoクエリ-注釈付きカウントフィルターで親オブジェクトを取得します

  10. 10

    プリフェッチされたサブクエリの関数でdjangoクエリセットに注釈を付ける方法

  11. 11

    プリフェッチされたサブクエリの関数でdjangoクエリセットに注釈を付ける方法

  12. 12

    Djangoのフィールド値の対数でクエリセットに注釈を付ける

  13. 13

    ManyToManyリレーションからのブール値でクエリセットに注釈を付ける

  14. 14

    別の「フィルター」クエリセットのオブジェクトでクエリセットに注釈を付ける

  15. 15

    django選択したクエリ値のカウントに注釈を付ける方法

  16. 16

    カウントにDjangoクエリセットの条件で注釈を付ける方法

  17. 17

    Djangoは個別のフィールドでカウントに注釈を付けます

  18. 18

    DjangoORM最適化-カウントによる注釈と注釈フィルターの最後のエントリ

  19. 19

    注釈が付けられているフィールドのタイプに基づいてコンパイル時エラーを生成できますか

  20. 20

    Django:フィルタリングされた逆の関係に注釈を付ける

  21. 21

    フィルタリングされた結合からの最新の値でQuerySetに注釈を付けます

  22. 22

    フィールドに注釈が付けられている場合はコンストラクターを保持

  23. 23

    Django 1.11サブクエリ集合に注釈を付ける

  24. 24

    Django 1.11サブクエリ集合に注釈を付ける

  25. 25

    Django 1.11サブクエリ集合に注釈を付ける

  26. 26

    Django-クエリ:関連するモデルフィールドでクエリセットに注釈を付ける

  27. 27

    注釈付きのDjangoクエリセット、なぜGROUP BYがすべてのフィールドに適用されるのですか?

  28. 28

    Djangoクエリセット。1つのクエリでさまざまなフィールドに注釈を付ける

  29. 29

    Djangoクエリセット。1つのクエリでさまざまなフィールドに注釈を付ける

ホットタグ

アーカイブ