Django: Как создать некоторую переменную в модели на основе данных внешнего ключа?

Я новичок в Django и сейчас работаю над своим первым проектом: сидит система бронирования для какого-то кинотеатра. Для этого я создал 3 модели: Кино, Зал и Событие. Зал генерирует карту сидений в виде массива.

class Hall(models.Model):
HALL_NAME = (
    ('A', 'Hall A'),
    ('B', 'Hall B'),
    ('C', 'Hall C')
)
hall_name = models.CharField(choices=HALL_NAME, max_length=30)
hall_structure = models.CharField(max_length=10000, default=generate_sits(hall_name))

@property
def get_sits(self):
    if self.hall_name == 'A':
        return generate_sits('A')
    if self.hall_name == 'Hall B':
        return generate_sits('B')
    if self.hall_name == 'Hall C':
        return generate_sits('C')
    else:
        return "lol"

def __str__(self):
    return f'{self.hall_name}'

После этого я хочу создать переменную для модели событий, которая берет структуру массива сидений и превращает ее в словарь (пример ['A1': 'empty', 'A2': 'empty', ...]). Я хочу, чтобы эта переменная перезаписывалась в будущем, когда кто-то забронирует место на сайте (['A1': 'reserved']).

Вот моя модель событий:

class Event(models.Model):

EVENT_DAYS = (
    ('mon', 'Monday'),
    ('tu', 'Tuesday'),
    ('we', 'Wednesday'),
    ('th', 'Thursday'),
    ('fr', 'Friday'),
)

EVENT_TIME_SLOT = (
    ('10', '10:00'),
    ('13', '13:30'),
    ('17', '17:00'),
    ('20', '20:30'),
    ('00', '00:00'),
)

EVENT_TYPE = (
    ('2d', '2D'),
    ('3d', '3D'),
)

end_default = "for this Event was assigned yet"
days_default = "No day "
time_default = "No time "
hall_default = "No hall "

week_day = models.CharField(max_length=10, choices=EVENT_DAYS, default=days_default + end_default)
time_slot = models.CharField(max_length=10, choices=EVENT_TIME_SLOT, default=time_default + end_default)
type = models.CharField(max_length=2, choices=EVENT_TYPE, default=EVENT_TYPE[0])
hall = models.ForeignKey(Hall, on_delete=models.CASCADE)

film = models.ForeignKey(Movie, on_delete=models.CASCADE)

start_date = models.DateField(auto_now_add=False, auto_now=False, blank=True)
end_date = models.DateField(auto_now_add=False, auto_now=False, blank=True)

def __str__(self):
    return f'{self.film.name}'

И я попробовал здесь что-то вроде этого:

    default_sits_map = dict.fromkeys(hall.get_sits, 'Empty')

Но, как я понял, вы не можете получить доступ к классу таким образом (как будто он является объектом).

Я действительно не понимаю, как создать такую обновляемую переменную для каждого события, основываясь на структуре зала. Заранее благодарю всех, кто нашел время прочитать это и высказать свое мнение по данной теме.

Я решил проблему, немного реструктуризировав проект. Строки и столбцы конкретного зала теперь просто хранятся в модели:

Models.py

class Hall(models.Model):
HALL_NAME = (
    ('A', 'Hall A'),
    ('B', 'Hall B'),
    ('C', 'Hall C')
)

hall_name = models.CharField(choices=HALL_NAME, max_length=30)
hall_sits = models.IntegerField()
hall_cols = models.IntegerField()

def __str__(self):
    return f'{self.hall_name}'

Используя это, я смог сгенерировать новую html/css сетку карты событий из views:

Views.py

def event_map(request, slug, event_id):
selected_event = Event.objects.get(pk=event_id)

movie = selected_event.film
hall = selected_event.hall
time = selected_event.get_time_slot_display()
date_event = selected_event.get_week_day_display()

sits = list(range(0, hall.hall_sits))
cols = list(range(0, hall.hall_cols))
# and so on

И перенесли проверку зарезервированных мест в описание модели счета-фактуры:

Models.py

class Invoice(models.Model):
user = models.ForeignKey(UserPersonalData, on_delete=models.CASCADE, 
blank=True, null=True)
total_price = models.FloatField()
email = models.CharField(max_length=320)
invoice_details = models.CharField(max_length=2048)
invoice_key = models.CharField(editable=False, max_length=12, default=generate_invoice_key())
event = models.ForeignKey(Event, on_delete=models.CASCADE)

def __str__(self):
    return f'{self.email} {self.invoice_key}'
Вернуться на верх