Я наконец нашел два решения, которые работали для меня: Благодаря ответу @ Ramy я переопределил DjangoJSONEncoder
, чтобы поддержать преобразование десятичного числа в число с плавающей точкой:
import decimal
import uuid
from django.utils.functional import Promise
from django.core.serializers.json import DjangoJSONEncoder
class JsonDecimalToFloatEncoder(DjangoJSONEncoder):
def default(self, o):
if isinstance(o, (decimal.Decimal, uuid.UUID, Promise)):
return float(o)
return super().default(o)
и я использовал его, как он упоминал:
monthly_revenue = list(Booking.objects.annotate(month=Month('created_at'))
.values('month')
.annotate(total=Sum('price'))
.order_by('month'))
json_result = json.dumps(monthly_revenue,cls=ExtendedEncoder)
json_result
'[{"month": 11, "total": 4550.0}]'
это решение требует больше работы на стороне сервера, поэтому я выбрал второе решение @ rossi , которое делает больше работать с базой данных, а не с сервером, и это то, что предлагает документация django.
from django.db.models import FloatField
from django.db.models.functions import Cast
list(Booking.objects.annotate(month=Month('created_at'))
.values('month')
.annotate(total_as_f=Cast('total',
output_field=FloatField()))
.order_by('month'))
[{'month': 11, 'total': Decimal('4550.00'), 'total_as_f': 4550.0}]
надеюсь, что это поможет любому в будущем.