Могу ли я иметь столбец перечисления массива с Flask-SQLAlchemy ..? - PullRequest
1 голос
/ 22 сентября 2019

У меня есть кейс для составления студенческого курса, который также содержит расписание для студентов.И я делаю модель расписания с Flask-SQLAlchemy и использую PostgreSQL в качестве своей базы данных.

Вот фрагмент моего текущего кода:

class DayNameList(enum.Enum):
    Sunday = 'Sunday'
    Monday = 'Monday'
    Tuesday = 'Tuesday'
    Wednesday = 'Wednesday'
    Thursday = 'Thursday'
    Friday = 'Friday'
    Saturday = 'Saturday'

    def __str__(self):
        return self.value

class Schedule(db.Model):
    __tablename__ = 'schedule'
    id = db.Column(db.Integer, primary_key=True)
    schedule_day = db.Column(db.Enum(DayNameList, name='schedule_day'))
    start_at = db.Column(db.Time())
    end_at = db.Column(db.Time())
    # ...
    # ...

В моем случае для студентов есть два календарных дня на каждую неделю.

В моем текущем коде столбец schedule_day имеет тип Enum.

Итак, мои вопросыесли я должен сделать schedule_day значением ARRAY Enum ..?, если да, то как насчет столбцов start_at и end_at ..?, я должен также преобразовать его в ARRAY ..?и любой пример, как это сделать ..?

Или я должен добавить новый столбец, то есть schedule_day_2 или что ..?

Какова лучшая практика ..?Любая помощь будет признательна, спасибо:)

1 Ответ

1 голос
/ 22 сентября 2019

Рассмотрите возможность создания отдельной модели для ScheduleDay, которая может быть связана с вашим Schedule с отношением Один-ко-многим.

class Schedule(db.Model):
    __tablename__ = 'schedule'
    id = db.Column(db.Integer, primary_key=True)
    days = db.relationship('ScheduleDay', backref='schedule', lazy=True)
    # ...
    # ...

class ScheduleDay(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    day = db.Column(db.Enum(DayNameList, name='schedule_day'))
    start_at = db.Column(db.Time())
    end_at = db.Column(db.Time())
    schedule_id = db.Column(db.Integer, db.ForeignKey('schedule.id'),
        nullable=False)

В случае, если у какой-либо недели будет больше 2 дней, вы можетелегко добавить больше из них.

Пример:

>>> schedule = Schedule()
>>> db.session.add(schedule)
>>> db.session.commit()
>>> from datetime import time
>>> monday_schedule = ScheduleDay(day=DayNameList.Monday, start_at=time(10, 15), end_at=time(12, 15), schedule_id=schedule.id)
>>> db.session.add(monday_schedule)
>>> tuesday_schedule = ScheduleDay(day=DayNameList.Tuesday, start_at=time(15, 15), end_at=time(17, 15), schedule_id=schedule.id)
>>> db.session.add(tuesday_schedule)
>>> db.session.commit()
>>> schedule.days
[<ScheduleDay 1>, <ScheduleDay 2>]
>>> schedule.days[0].day
<DayNameList.Monday: 'Monday'>
>>> schedule.days[1].day
<DayNameList.Tuesday: 'Tuesday'>
...