I have this code:
q = MyModel.objects.order_by(\'-value1\').annotate(
res=ExpressionWrapper(
(F(\'value1\') / F(\'value2\')),
The result you are expecting is really easy to achieve with a raw query and really, I mean really hard to achieve with pure 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)
You wouldn't accuse this of being elegant but it works on both Mysql and Postgresql.
To provide some background. The rounding is done by the database doing integer division because the field you have are ints. If you want decimal division you need to cast them to decimals. Unfortunately casting is not very easy with Django.
Postgresql has a really elegant way to cast to float. value1::float but this cannot be made use of from inside django (at least as far as I know)