Выполняет ли 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()),