Python Django. Аренда Байков. Реализация занят/свободен
Задача такая. Для каждого байка есть модель, вот часть модели, показывающая на то, свободен ли байк. Модель стандартная. bikes/models.py:
class Bike(models.Model):
...
STATUSES = [
('FRE', "Bike is free"),
('DRV', "Bike on drive"),
('REP', "Bike on repair"),
('OFF', "bike is not available")]
status = models.CharField(choices=STATUSES, max_length=3, verbose_name='Bike status', default="FRE")
При создании заказа( Order ), имеем и строки заказа ( OrderLine), байков может быть много с разным временем аренды в одном заказе. order/models.py:
from bikes.models import Bike
class Order(models.Model):
date_order = models.DateTimeField(verbose_name='Date of order', auto_now_add=True)
...
date_delivery = models.DateTimeField(null=True, blank=True, )
STATUSES = [
('NEW', 'Новый заказ'),
('APR', 'Подтвержден'),
('PAY', 'Оплачен'),
('CNC', 'Отменен')]
status = models.CharField(choices=STATUSES, max_length=3, default='NEW')
def display_amount(self):
amount = 0
for order_line in self.orderline_set.all():
if order_line.bike.model.price >= 1:
amount += order_line.bike.model.price * order_line.days
return f'{amount} USD.'
display_amount.short_description = "Цена заказа"
class OrderLine(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE)
bike = models.ForeignKey(Bike, on_delete=models.SET_NULL, null=True)
days = models.IntegerField(default=1, validators=[MinValueValidator(1), MaxValueValidator(31)])
date_start = models.DateTimeField(null=True, blank=True, )
date_end = models.DateTimeField(null=True, blank=True, )
class Meta:
ordering = ['-id']
verbose_name = 'OrderLine'
def __str__(self):
return str(self.days)
Каждый байк уникален, у каждого свой номерной знак.
Не понимаю, как реализовать функцию "ЗАНЯТ/СВОБОДЕН", где эти данные хранить(словарь с { "дата": 'занят', "дата":"свободен"}, или просто в кортеже даты "Когда байк занят") как их туда записывать, как их считывать потом, как реализовать проверку на "свободность" при заполнении формы на сайте.
Или вообще реализовывать класс Календарь с атрибутами, но какие туда атрибуты включать, от кого кого наследовать.
вопросов больше, чем ответов
что делать в такой ситуации. Подскажите, товарищи!
Попытался написать метод, который бы проверял на валидность даты. Метод работает, сохраняет даты, если новая дата не занята в списке. Но вот беда, не знаю, как его использовать в Джанге(как заставить БД сохранить список этих дат, какой вид поля выбирать) , создавать ли новый класс "Календарь" и наследовать в него Байк, или наоборот, сделать, чтобы байк наследовал этот класс "календарь" . Памагите!
from datetime import date, timedelta
def dates_valid(start_date, end_date, not_fre):
def daterange(start_date, end_date):
for n in range(1 + int((end_date - start_date).days)):
yield start_date + timedelta(n)
valid = False
for i in daterange(a, b):
if i.strftime("%Y-%m-%d") in not_fre:
valid = False
break
else:
valid = True
if valid:
for i in daterange(a, b):
not_fre.append(i.strftime("%Y-%m-%d"))
return 'Dates added'
else:
return 'Problem with dates! Try again!'
not_fre = ['2022-01-21', '2022-01-22', '2022-01-23', '2022-01-24', '2022-01-25', '2022-01-26',
'2022-01-27', '2022-01-28', '2022-01-29', '2022-01-30', '2022-01-31']
a = date(2022, 1, 20)
b = date(2022, 1, 21)
print(dates_valid(a, b, not_fre))
print(not_fre)