Исправлено: передача 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:
@@ -803,7 +803,8 @@ def get_items_api(request):
|
|||||||
'type': 'product',
|
'type': 'product',
|
||||||
'available_qty': str(available),
|
'available_qty': str(available),
|
||||||
'reserved_qty': str(reserved),
|
'reserved_qty': str(reserved),
|
||||||
'free_qty': float(free_qty) # Для сортировки
|
'free_qty': str(free_qty), # Передаём как строку для сохранения точности
|
||||||
|
'free_qty_sort': float(free_qty) # Для сортировки отдельное поле
|
||||||
})
|
})
|
||||||
|
|
||||||
# Prefetch для первого фото комплектов
|
# Prefetch для первого фото комплектов
|
||||||
@@ -853,22 +854,23 @@ def get_items_api(request):
|
|||||||
'sku': k.sku or '',
|
'sku': k.sku or '',
|
||||||
'image': image_url,
|
'image': image_url,
|
||||||
'type': 'kit',
|
'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 = 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)
|
paginator = Paginator(all_items, page_size)
|
||||||
page_obj = paginator.get_page(page)
|
page_obj = paginator.get_page(page)
|
||||||
|
|
||||||
# Удаляем временное поле free_qty из результата
|
# Удаляем временное поле free_qty_sort из результата (оставляем free_qty как строку)
|
||||||
items_to_return = []
|
items_to_return = []
|
||||||
for item in page_obj.object_list:
|
for item in page_obj.object_list:
|
||||||
item_copy = item.copy()
|
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)
|
items_to_return.append(item_copy)
|
||||||
|
|
||||||
return JsonResponse({
|
return JsonResponse({
|
||||||
|
|||||||
Reference in New Issue
Block a user