Как сохранить несколько значений в поле модели django - PullRequest
1 голос
/ 07 мая 2020

У меня есть модель, в которой я сохраняю повторяющиеся занятия в моем тренажерном зале.

DAYS_OF_WEEK = (
    (0, _("Monday")),
    (1, _("Tuesday")),
    (2, _("Wednesday")),
    (3, _("Thursday")),
    (4, _("Friday")),
    (5, _("Saturday")),
    (6, _("Sunday")),
)
class RecurringSession(models.Model):
    session = models.ForeignKey(SessionType,  db_index=True, on_delete=models.CASCADE)
    dayofweek = models.PositiveSmallIntegerField(choices=DAYS_OF_WEEK)
    time = models.TimeField()

Однако некоторые занятия проводятся чаще, чем раз в неделю. Как лучше всего хранить несколько значений (от 1 до 7) в этом поле модели? Я использую Django Mysql 8.0, и, насколько я понимаю, он поддерживает поле JSON, но из документов django кажется, что пока поддерживается только Postgres. Есть ли способ сделать это c django? Может быть, сохранить charfield со значениями, разделенными запятыми? Мне не нужно искать по этому полю.

Каждую неделю будет выполняться задание cron, которое будет читать эту модель и создавать экземпляр каждого сеанса для другой модели. (Мне нужна каждая сессия как экземпляр для настройки: замена учителя, список сессий, статус сессии - я могу отменить отдельную сессию в праздничный день или по другой причине). Таким образом, в этом «RecurringSessions» я буду хранить информацию о сеансе, которая будет генерироваться каждую неделю. То, как я сначала написал, будет модельный экземпляр для каждого дня недели одного и того же сеанса, но я хочу сгруппировать их в один и тот же экземпляр, потому что я думаю, что он выглядит лучше и может облегчить установку учителя в навалом. В качестве альтернативы я мог бы сохранить json с dict для нескольких значений дня / времени для каждого сеанса, однако это немного усложнит проверку того, что если cronjob запускается дважды, класс не дублируется.

Теперь, чтобы этого избежать, у меня есть UniqueConstraint в моей модели расписания с полями «день», «время» и «комната»

Использование Django 3.0.6, Python 3.8. 2, и MySQL 8.0.20.

спасибо

Ответы [ 2 ]

1 голос
/ 11 мая 2020

Вы пытаетесь установить связь «многие-к-одному», поэтому вам придется использовать этот метод docs.djangoproject.com / en / 3.0 / themes / db / examples / many_to_one, или если вы хотите избежать создания таблицы базы данных и использовать поле выбора Django, вы можете использовать это расширение .

Поскольку в неделе семь фиксированных дней, я предпочитаю второй метод, а не создание таблицы БД и ненужные запросы БД.

1 голос
/ 07 мая 2020

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

class Session(models.Model):
    TYPE_CHOICES = (('C','Cardio'), #...and so on
    DAY_CHOICES = ((1,'Monday'), #...and so forth

    type = models.CharField(max_length=10, choices=TYPE_CHOICES)
    day = models.PositiveSmallIntegerField(choices=DAY_CHOICES)
    time = models.TimeField()

Вы можете найти повторяющиеся сеансы, подсчитав количество экземпляров сеанса после того, как вы применили фильтр к типу или другому полю. Это сделает структуру вашей модели краткой и предоставит вам достаточно информации в одном месте для фильтрации, аннотации и т. Д. c. по мере необходимости.

...