0

生のクエリ自体は正しく、データベースから rawqueryset を取得できます。さらに処理するためにこれをクエリセットに変換する必要があり、以下のエラーに直面しています。

対応する django クエリを作成するのは私にとって困難でした。そのため、SQL クエリを作成し、生のクエリ セットを取得し、さらに処理するためにそれをクエリ セットに変換しようとしました。

匿名性のために、django のモデル名とテーブル名を変更しました。

これは、djangoシェルで試した出力です。以下のクエリを実行できましたが、以下の「クエリセット」にアクセスしようとすると、「django.db.utils.ProgrammingError: サブクエリに列が多すぎます」というエラーが表示されます。

from django.db.models.expressions import RawSQL
from xyz.models import *
value = '1.2.3.4'
queryset = Test1.objects.filter(id__in=RawSQL("SELECT DISTINCT ON (test1.start_time, test1.id) test1.id, test1.name, test1.start_time FROM test1 WHERE EXISTS (SELECT * FROM test2 JOIN test3 ON test2.test3_id = test3.id AND test3.value = %s JOIN test4 ON test2.test4_id = test4.id AND test4.test1_id = test1.id) ORDER BY test1.start_time DESC", params=[value]))

読みやすくするために、以下で使用するクエリをフォーマットしました。

SELECT
  DISTINCT ON (test1.start_time, test1.id)
  test1.id,
  test1.name,
  test1.start_time
FROM
  test1
WHERE
  EXISTS (
    SELECT
      *
    FROM
      test2
      JOIN test3 ON test2.test3_id = test3.id
      AND test3.value = 'value'
      JOIN test4 ON test2.test4_id = test4.id
      AND test4.test1_id = test1.id
  )
ORDER BY
  test1.start_time DESC
4

2 に答える 2