Выполняет ли Cast Function округление перед литьем Django?
Я ожидаю, что функция Cast в Django будет выполнять только приведение, например, 7.6 будет 7 без выполнения округления.
Например, в Mysql следующее:
select CAST(((<value> - 1) div 30) AS SIGNED INTEGER)
При value, равном 227, получится 7.
Но с помощью Django Cast можно сделать следующее:
MyModel.objects.annotate(time_window = Cast((F('field') - 1) / 30, IntegerField()))
произведет 8 для некоторой записи, имеющей значение 227 для field.
Мои ожидания неверны, или существует какой-то флаг, предотвращающий такое поведение округления?
Как заметил @Salman_A, запрос sql выполняет целочисленное деление, а запрос django использует CAST, который будет выполнять округление.
Проблема в том, что вы не можете просто заменить / на // в запросе django, потому что это вызовет ошибку TypeError.
Решением было выполнение операции devision с последующей операцией floor, что-то вроде:
Floor(F('Field') / <some constant>, output_field=IntegerField()),