У меня есть требование, похожее на этот вопрос, мне нужно цены в магазине на дату (цены меняются в зависимости от сезона), и я разработал модель ниже:
room_calendar :
room_id :
date :
price:
Я должен хранить даты до ~ одного года, а затем запустить запрос, чтобы получить все цены для x диапазонов дат и sum() всех цен.
Я думаю, что этот подход хорош, но недостатком является объем данных в базе данных и производительность при выполнении запросов, когда в базе данных много записей.
У меня есть еще один второй подход:
(дата расчета во время выполнения) Да, я знаю! это может показаться сумасшедшим
db model:
room_calendar :
room_id :
date_rule: <- store a dateutil rrule
price:
results:
{'room_id': {'dates': <dateutil.rrule.rrule object at 0x7fa2a8e3bda0>, 'price': 100}}
{'room_id': {'dates': <dateutil.rrule.rrule object at 0x7fa2a8e3bda0>, 'price': 150}}
Затем:
dates_to_reserve = [datetime(2020, 1, 1), datetime(2020, 1, 2), datetime(2020, 1, 3)]
room_price.objects.filter(date_rule__in=dates_to_reserve)
Конечно, мне пришлось бы создать настраиваемое поле, которое поддерживает хранилище dateutil.rrule
, и когда я запрашиваю его с помощью __in
, нажимаю метод __contains__
dateutil.rrule
.
извините, я не могу выразить все лучше, ИЗВИНИТЕ ЗА МОЙ ПЛОХОЙ АНГЛИЙСКИЙ
У вас есть что-то лучше, чем первый подход?
Есть ли смысл так увлекаться вторым подходом?
Как бы вы это сделали? хранить каждую дату или вычислять ее во время выполнения
ИЗМЕНИТЬ
Спасибо за ваш комментарий @iain-shelvington:
Насколько сложны правила, влияющие на цену, и отличаются ли они для каждого номера?
- Каждое правило отличается для каждой комнаты
- Комната имеет несколько правил
- Каждое правило может быть ЕЖЕМЕСЯЧНЫМ или ЕЖЕНЕДЕЛЬНЫМ, в основном
Можете ли вы привести пример номера, его базовую цену и возможную цену на каждую дату? Эж.:
Room standard > price: 150 > date_rule: from Jan 2020 weekly on weekdays until Feb 25 2020
Room standard > price: 170 > date_rule: from Jan 2020 weekly on weekends until Feb 25 2020
Room standard > price: 180 > date_rule: from Feb 2020 weekly on weekends until May 26 2020
Я разработал приложение на основе dateutil.rrule, которое правильно обрабатывает даже более сложные правила, поэтому правила не будут проблемой. Написание эффективного алгоритма, вычисляющего цены по дате во время выполнения, было бы проблемой.
Спасибо