Задать вопрос
Sergei_Erjemin
@Sergei_Erjemin
Улыбайся, будь самураем...

Как победить «Raw query must include the primary key» в Django?

Я знаю, что raw-запросы Django требуют наличия поля id (primary key). И раньше прекрасно срабатывало присваивание id через AS. Но почему-то это перестало работать в текущем проекте:
q_filial = TbPeople.objects.raw("SELECT DISTINCT szFilial AS id "
                                "FROM web_tbpeople ORDER BY szFilial;")

Выбрасывает по FieldDoesNotExist (Raw query must include the primary key)... :((

Если написать через ORM, например что-то типа:
q_filial = TbPeople.objects.distinct('szFilial').values_list('szFilial', flat=True)

То вываливается по NotSupportedError (DISTINCT ON fields is not supported by this database backend). На самом деле, база все поддерживает, это бэкенд перестал. А без distinct('szFilial'), само собой, запрос на работает (точнее выдает все значения, а не уникальные... и с distinct() тоже. Как побеждать?

Django -- 4.1.4
MariaDB -- 10.5.10
Python -- 3.8.10
  • Вопрос задан
  • 278 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
Sergei_Erjemin
@Sergei_Erjemin Автор вопроса
Улыбайся, будь самураем...
Непонятно почему, но срабатывает так:
q_filial = TbPeople.objects.raw("SELECT DISTINCT web_tbpeople.szFilial, 1 AS id "
                                "FROM web_tbpeople ORDER BY web_tbpeople.szFilial;")


Ну и еще, надо следить какое поле -- первичный ключ. В моем случае ключ был szID и это строковая переменная. Таким образом для моего случая рабочий код вот такой:
q_filial = TbPeople.objects.raw("SELECT DISTINCT web_tbpeople.szFilial, '1' AS szID "
                                "FROM web_tbpeople ORDER BY web_tbpeople.szFilial;")


!!!ПРИ ЭТОМ, ЕСЛИ НЕ СОЗДАВАТЬ ВТОРОГО ФИКТИВНОГО ПОЛЯ С КЛЮЧОМ, ТО УЖЕ НЕРАБОТАЕТ!!! НАПРИМЕР ВОТ ТАК:
q_filial = TbPeople.objects.raw("SELECT DISTINCT web_tbpeople.szFilial AS szID"
                                "FROM web_tbpeople;")

!!ПАДАЕТ!!
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы