Как преобразовать необработанный набор запросов в набор запросов?

Сам необработанный запрос верен, и я могу получить набор необработанных запросов из базы данных. Мне нужно преобразовать это в набор запросов для дальнейшей обработки, и я столкнулся с ошибкой ниже.

Создание соответствующего запроса django было для меня сложным, поэтому я создал SQL-запрос, получил необработанный набор запросов и теперь пытаюсь преобразовать его в набор запросов для дальнейшей обработки.

Я изменил имена моделей django и имена таблиц для анонимности.

Вот результат того, что я пробовал в оболочке django. Значение test3.value будет установлено динамически, и я делаю это в необработанном операторе запроса.

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 = {} JOIN test4 ON test2.test4_id = test4.id AND test4.test1_id = test1.id) ORDER BY test1.start_time DESC".format(value)))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'params'

Для удобочитаемости я отформатировал необработанный SQL-запрос, использованный выше.

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 = {}
      JOIN test4 ON test2.test4_id = test4.id
      AND test4.test1_id = test1.id
  )
ORDER BY
  test1.start_time DESC.format(value)

person Sandesh Veerapur    schedule 07.04.2021    source источник
comment
Этот запрос выполнен успешно. rawquery = Test1.objects.raw (ВЫБЕРИТЕ РАЗЛИЧНЫЕ НА (test1.start_time, test1.id) test1.id, test1.name, test1.start_time ОТ test1, ГДЕ СУЩЕСТВУЕТ (SELECT * FROM test2 ПРИСОЕДИНЯЙТЕСЬ к test3 ON test2.test3_id = test3.id И test3.value = {} ПРИСОЕДИНЯЙТЕСЬ к test4 ON test2.test4_id = test4.id AND test4.test1_id = test1.id) ORDER BY test1.start_time DESC.format(value)))   -  person Sandesh Veerapur    schedule 08.04.2021
comment
Вы неправильно используете RawSQL. Прочтите документацию: docs.djangoproject.com/en /3.1/ссылка/модели/выражения/   -  person PerunSS    schedule 08.04.2021
comment
Я использовал эту статью stackoverflow.com/questions/48288076/ в качестве ссылки и написал свой код выше.   -  person Sandesh Veerapur    schedule 08.04.2021
comment
Является ли queryset модулем в django? Я получаю сообщение об ошибке NameError: имя 'queryset' не определено для набора запросов, когда я выполняю queryset.annotate(val=RawSQL(выберите col from sometable, где othercol = %s, (someparam,)))   -  person Sandesh Veerapur    schedule 08.04.2021
comment
Запросу нужны дополнительные параметры params. Вот. queryset = Test1.objects.filter(id__in=RawSQL(ВЫБЕРИТЕ РАЗЛИЧНЫЕ НА (test1.start_time, test1.id) test1.id, test1.name, test1.start_time ИЗ test1, ГДЕ СУЩЕСТВУЕТ (SELECT * FROM test2 ПРИСОЕДИНЯЙТЕСЬ к test3 ON test2.test3_id) = test3.id И test3.value = {} ПРИСОЕДИНЯЙТЕСЬ к test4 ON test2.test4_id = test4.id И test4.test1_id = test1.id) ЗАКАЗАТЬ ПО test1.start_time DESC, params=[value]))   -  person Sandesh Veerapur    schedule 08.04.2021