Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 5, 2015 22:05:27

int_0x80
Зарегистрирован: 2012-09-27
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

HStoreField и isnull: баг?

Приветствую, коллеги.

Есть модель с полем HStoreField.

class M(Model):
     hstore = HStoreField(default={})
Делаю такой запрос:
M.objects.filter(hstore__any_key__isnull=True)
При этом в hstore нет поля any_key. Т.е. получаем некую альтернативу такому запросу:
M.objects.exclude(hstore__has_key='any_key')
Получаю ошибку SQL сервера:
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
Если посмотреть на генерируемый SQL, то получаем такой WHERE:
WHERE "app_m"."hstore" -> 'any_key' IS NULL
А это некорректный запрос. Правильно так:
WHERE ("app_m"."hstore" -> 'any_key') IS NULL

Я так понимаю это баг?

p.s django 1.8, hstore из contrib.postgresql

Отредактировано int_0x80 (Апрель 5, 2015 22:06:40)

Офлайн

#2 Апрель 6, 2015 05:54:28

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

HStoreField и isnull: баг?

Делаю такой запрос:
Т.е. получаем некую альтернативу такому запросу:
Нет, не получаем. ОРМ обрабатывает эти конструкции по разному, следовательно на выходе разный результат. С чего вы взяли, что так можно делать? Я не увидел в документации, что с HStoreField допустимы __isnull запросы.



Офлайн

#3 Апрель 11, 2015 10:50:57

int_0x80
Зарегистрирован: 2012-09-27
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

HStoreField и isnull: баг?

FishHook
Нет, не получаем.
Да, Вы правы. Но судя по документации к hstore (http://www.postgresql.org/docs/9.4/static/hstore.html), значением ключа может быть NULL (и orm тоже позволяет это сделать), а так же, если ключ не представлен, то возвращается NULL, следовательно напрашивается операция __isnull.

Офлайн

#4 Май 14, 2015 11:03:40

int_0x80
Зарегистрирован: 2012-09-27
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version