@id2669099

Как в django реализовать оператор #>>?

Django 1.11
Postgres 9.6

Здравствуйте, есть таблица "table" и у неё есть поле "field", куда складываются типы данных jsonb. При формировании запроса мне необходимо вносить в него значения по вложенным ключам, при raw запросе никаких проблем не возникает и получается что-то вроде такого:
SELECT "table"."field" :: json#>>'{rootkey,nestedkey}' AS "nested_key" FROM "table"
WHERE "table"."param1" = value1;

Проблема возникает когда я нечто подобное хочу получить в django
MyModel.objects.filter(param1=value1).annotate(nested_key=RawSQL('"table"."field" :: json#>>\'{rootkey,nestedkey}\'', ()))

такой запрос в целом работает, но меня дико смущает использование RawSQL, можно ли как-нибудь избавиться от этого, может как-то по-особенному F использовать?

P.S.: в реальности запрос много сложнее, в этом псевдокоде я просто показал проблему, которая существует в реальном запросе.
  • Вопрос задан
  • 75 просмотров
Пригласить эксперта
Ответы на вопрос 1
Tiendil
@Tiendil
Разработчик ПО.
RawSQL и вообщеще запросов на SQL смущаться не надо :-) это вполне нормальная практика.

ORM делаются для упрощение жизни, но если мы что-то упрощаем, то что-то обязательно усложнится. В случае ORM усложняются нестандартные запросы. Если начать допиливать расширения для ORM, то работа с ней может стать сложнее формирования запросов на SQL и пропадёт весь профит.

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

P.S. При сложных запросах Django ORM значительно тормозит сама по себе (из-за суровой внутренней логики). Разработчики Django это исправляют, но очень медленно.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы