Я новичок в Django и сейчас работаю над своим первым проектом: сидит система бронирования для какого-то кинотеатра. Для этого я создал 3 модели: Movie, Hall и Event. Холл генерирует карту мест в виде массива.
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}'
После этого я хотел бы создать переменную для модели Event, которая берет структуру массива мест, превращает ее в словарь (пример ['A1': 'пусто', 'A2': 'пусто', ...]) . Я хочу, чтобы эта переменная была перезаписана в будущем, когда кто-то должен забронировать место на сайте (['A1': 'зарезервировано']).
Вот моя модель событий:
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')
Но, как я понял, вы не можете получить доступ к классу таким образом (как это объект).
Я действительно не понимаю, как создать такую обновляемую переменную для каждого события, основываясь на структуре зала. Заранее благодарю всех, кто нашел время прочитать это и высказал свое мнение по этой теме.
ОБНОВИТЬ:
вот также код функции, которая формирует список сидячих мест по названию зала (A, B или C)
def generate_sits(_hall: str):
sits = []
row = int()
if _hall == 'A' or _hall == 'B' or _hall == 'C':
if _hall == 'A':
row = 14
if _hall == 'B':
row = 12
if _hall == 'C':
row = 9
# sits setting begins here
for i in range(row):
i = i + 1
sits.append("A" + str(i))
for i in range(row):
i = i + 1
sits.append("B" + str(i))
for i in range(row):
i = i + 1
sits.append("C" + str(i))
for i in range(row):
i = i + 1
sits.append("D" + str(i))
# if hall is "A" or "B" - they get more sits then "C"
if _hall == 'A' or _hall == 'B':
for i in range(row):
i = i + 1
sits.append("E" + str(i))
for i in range(row):
i = i + 1
sits.append("F" + str(i))
return json.dumps(sits)
Если у вас есть класс, вы можете преобразовать класс в dict, как это mydict.__dict__
@daniherrera извините, если мой вопрос был недостаточно ясен. Я постараюсь изо всех сил объяснить это. Итак, у меня есть модель с именем Event, и я хочу, чтобы с этим событием была связана какая-то переменная, которая будет содержать словарь о сидячих местах ('A1': 'empy', 'A2': пусто,... ). Я также хочу создать форму в будущем на веб-сайте, чтобы обновить значение этой переменной/словаря, когда какой-либо пользователь должен забронировать место («A1»: «зарезервировано»). Я также добавил generate_sits к вопросу выше. Я очень ценю ваше желание помочь!
Я решил проблему, немного реструктуризировав проект. Строки и столбцы конкретного зала теперь просто хранятся в модели:
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.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}'
извините, я не понимаю вашего вопроса. Кроме того, что такое
generate_sits
? Можете ли вы опубликовать код?