fox_12
@fox_12
Расставляю биты, управляю заряженными частицами

Битовый запрос с F?

Есть некая модель User с целочисленным полем alert_flags.
Выполняю побитовые операции с каждым инстансом - все четко:
In [71]: User.objects.all().count()
Out[71]: 554

In [72]: len(filter(lambda x: x!=0, [im.alert_flags & 0b00010000 for im in User.objects.all()]))
Out[72]: 517

In [73]: len(filter(lambda x: x==0, [im.alert_flags & 0b00010000 for im in User.objects.all()]))
Out[73]: 37


Выполнение запроса к ОРМ приводит к совершенно неожиданным результатам:
In [74]: User.objects.filter(alert_flags=F('alert_flags').bitand(0b00010000)).count()
Out[74]: 63


Каким образом можно корректно осуществить побитовый запрос в базу через ОРМ?
  • Вопрос задан
  • 149 просмотров
Пригласить эксперта
Ответы на вопрос 1
@deliro
Агрессивное программирование
Какой-то бессмысленный у тебя запрос в SQL получается. Примерно вот такой формулировки:

"Покажи мне всех юзеров, у которых флаги равны флагам & 0b00010000". В выборку попадут все юзеры, такие, что маска не меняет их alert_flags с помощью побитового AND.

Используй annotate, а потом filter. Только правильно.
Ответ написан
Ваш ответ на вопрос

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

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