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

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']


def daterange(start_date, end_date):
    for n in range(1 + int((end_date - start_date).days)):
        yield start_date + timedelta(n)


a = date(2022, 1, 15)
b = date(2022, 1, 21)

for i in daterange(a, b):
    if i.strftime("%Y-%m-%d") in not_fre:
        print('Занято, ошибка добавления')
        break
    else:
        print('Свободно')
        not_fre.append(i.strftime("%Y-%m-%d"))
print(not_fre)
Вернуться на верх