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

Я новичок в 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)

извините, я не понимаю вашего вопроса. Кроме того, что такое generate_sits? Можете ли вы опубликовать код?

dani herrera 23.03.2022 09:35

Если у вас есть класс, вы можете преобразовать класс в dict, как это mydict.__dict__

Ankit Tiwari 23.03.2022 09:51

@daniherrera извините, если мой вопрос был недостаточно ясен. Я постараюсь изо всех сил объяснить это. Итак, у меня есть модель с именем Event, и я хочу, чтобы с этим событием была связана какая-то переменная, которая будет содержать словарь о сидячих местах ('A1': 'empy', 'A2': пусто,... ). Я также хочу создать форму в будущем на веб-сайте, чтобы обновить значение этой переменной/словаря, когда какой-либо пользователь должен забронировать место («A1»: «зарезервировано»). Я также добавил generate_sits к вопросу выше. Я очень ценю ваше желание помочь!

NightBottle 24.03.2022 15:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
41
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Другие вопросы по теме