Вы не включили модель для Product, но я предполагаю, что у вас там есть и DecimalField.
Я думаю, что ваша единственная проблема может заключаться в том, что вы конвертируете во float. Использование DecimalField здесь правильно, и причина этого в том, что вы хотите избежать float, потому что float не так точен, как вы думаете.
from decimal import Decimal
# ...
new_total = Decimal()
for item in cart.products.all():
new_total += item.price
cart.total = new_total
cart.save()
Или, что еще лучше, используя встроенные sum () и итератор (здесь не нужно импортировать десятичное число):
cart.total = sum(item.price for item in cart.products.all())
cart.save()
Кроме того, это быстрее, если не загружать все объекты из базы данных:
cart.total = sum(cart.products.values_list('price', flat=True))
cart.save()