Сделал модель Скидка с GenericForeignKey. Посчитать скидку в методе товара несложно. Но как этот результат дальше использовать для сортировок и выборок не нашел ответа. Возможно стоит смотреть в сторону Менеджера модели или queryset`a
sim3x: Логика - выбор макисмально возможной скидки из всех подходящих для товара.
Есть предложения как лучше организовать связи, если не через GenericForeignKey?
Отдельными ForeignKey на каждую модель?
Игорь Лютоев: да, отдельно
Тк скидки будут меняться
И добавь детали, как скидки применяются: действует только одна, вкладываются друг в друга, суммируются,...
Добавь детали в вопрос - они важны
Я не вижу простого решения такой задачи = нужно писать процедуру (или сложный селект), или упрощать модель скидок, или убирать пользовательскую скидку, или ...
Игорь Лютоев: собственно, задача простая. Нужно только четко проговорить с бизнесом, как все должно работать и реализовать.
Под "простым решением", я подразумеваю встроенное в орм или однострочник на питоне (без потери производительности)
Как вариант, для начала можно сортировать по базовой цене и "заставлять" пользователя искать самому самую меньшую цену - так можно увеличить глубину просмотров.
*Для некоторых категорий пользователей
Сортировка по рубрике и бренду - делается сразу и без проблем
По товару
делаем поля
base_price - базовая цена без скидки
current_price - цена для продажи или равна base_price, или меньше
Сортируем все по current_price
"Обычно" не парятся и делают скидки для пользователя только в корзине
отсортировать по нужному полю своими методами, создав список отсортированных id, потом вернуть queryset по списку отсортированных id model.objects.filter(pk__in=list_of_ids)
Tash1moto: А можно просто в SQL создать динамическое поле и даже создать к нему индекс и не костылить, а аккуратно завернуть в менеджер. 10кк таблицы я видел, у меня есть даже такая. Не товары, но зачем советовать изначально костыльное решение? 10к таблица с товарами более чем реальна. Представь себе запрос SELECT ... FROM ... WHERE id IN (1,2,3,4,5,6 ... 10000); Сколько он будет выполняться?
Если например понадобится сортировать по другому полю другой таблицы, делаешь аннотацию, и можешь по тому лукапу фильтровать или сортировать. Очень в свое время спасла.