Исправлено: передача free_qty как строки для сохранения точности

Проблема:

- free_qty передавался как float(decimal) в JSON API

- При конвертации Decimal→float терялась точность

- JavaScript показывал -0.050000000000044 вместо -0.05

Решение:

- free_qty теперь передаётся как строка: str(free_qty)

- Добавлено отдельное поле free_qty_sort (float) для сортировки

- После сортировки free_qty_sort удаляется из результата

- JavaScript parseFloat() корректно парсит строку без потери точности

Результат:

- Отображение остатков точное: -0.05 вместо -0.050000000000044

- Нет округления на фронте - видны реальные данные

- Сортировка по остаткам работает корректно
This commit is contained in:
2026-01-02 15:30:00 +03:00
parent f55f358e8f
commit 4d121e95af

View File

@@ -803,7 +803,8 @@ def get_items_api(request):
'type': 'product',
'available_qty': str(available),
'reserved_qty': str(reserved),
'free_qty': float(free_qty) # Для сортировки
'free_qty': str(free_qty), # Передаём как строку для сохранения точности
'free_qty_sort': float(free_qty) # Для сортировки отдельное поле
})
# Prefetch для первого фото комплектов
@@ -853,22 +854,23 @@ def get_items_api(request):
'sku': k.sku or '',
'image': image_url,
'type': 'kit',
'free_qty': 0 # Для сортировки комплекты всегда внизу
'free_qty': '0', # Строка для консистентности с товарами
'free_qty_sort': 0 # Комплекты всегда внизу при сортировке
})
# Объединяем и сортируем по free_qty DESC
# Объединяем и сортируем по free_qty_sort DESC
all_items = products + kits
all_items.sort(key=lambda x: x['free_qty'], reverse=True)
all_items.sort(key=lambda x: x['free_qty_sort'], reverse=True)
# Пагинация
paginator = Paginator(all_items, page_size)
page_obj = paginator.get_page(page)
# Удаляем временное поле free_qty из результата
# Удаляем временное поле free_qty_sort из результата (оставляем free_qty как строку)
items_to_return = []
for item in page_obj.object_list:
item_copy = item.copy()
item_copy.pop('free_qty', None)
item_copy.pop('free_qty_sort', None) # Удаляем только free_qty_sort
items_to_return.append(item_copy)
return JsonResponse({