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)

Ответы (0 шт):