Результат, которого вы ожидаете, очень легко достичь с помощью сырого запроса, и действительно, я имею в виду очень трудно достичь с чистым django.
from django.db.models import FloatField, ExpressionWrapper, F
template = '%(function)s(%(expressions)s AS FLOAT)'
fv1 = Func(F('value1'), function='CAST', template=template)
fv2 = Func(F('value2'), function='CAST', template=template)
ew = ExpressionWrapper(fv1/fv2, output_field = FloatField())
q = MyModel.objects.order_by('-value1').annotate(res = ew)
Вы не обвиняете это в элегантности, но он работает как на Mysql, так и на Postgresql.
Чтобы предоставить некоторый фон. Округление выполняется с помощью базы данных, производящей целочисленное деление, потому что поле у вас есть ints. Если вы хотите десятичное деление, вам нужно отбросить их на десятичные числа. К сожалению, с Django отличное отбрасывание.
Postgresql имеет действительно элегантный способ бросить плавать. value1 :: float, но этого нельзя использовать изнутри django (по крайней мере, насколько я знаю)
Вы пробовали 'float (F ('value1'))'? – trantu
Вещь в выражениях 'F' заключается в том, что Python не знает о значениях, но передает эту операцию (деление в этом случае) в базу данных. Для PostgreSQL и MySQL целочисленное деление приводит к целому числу, как в Python 2.x – schwobaseggl
Аргумент @trantu float() должен быть строкой или числом, а не 'F' – tim