
我有一个模型,我在我的健身房上存储重复的课程。
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之间)在该modelfield上?我使用的是Django Mysql 8.0,据我所知,它支持JSON字段,但从django文档看来,到目前为止,只有Postgres支持。也许存储一个以逗号分隔的charfield,我不需要通过该字段进行搜索。
每周,会有一个cronjob读取这个模型,并在另一个模型上创建一个每个会话的实例(我需要每个会话作为一个实例来定制:教师替换,会话名册,会话状态--我可能会在银行假期或其他原因取消一个会话).所以这个 "RecurringSessions "将是我存储会话信息的地方,每周都会生成。 我一开始写的方式将有一个模型实例的一周的每一天相同的会议,但我想把他们在同一个实例中,因为我认为它看起来更好,并可能使它更容易设置老师在批量.或者,我可以存储一个json与dict为多个日间值为每个会话,然而,这将使它有点困难,以确保如果cronjob运行两次的类不会得到重复。
现在,为了避免这种情况,我在我的日程模型中设置了一个UniqueConstraint,其字段为 "day"、"time "和 "room"。
使用Django 3.0.6,Python 3.8.2,MySQL 8.0.20。
谢谢
投票
你正试图做一个多对一的关系,所以你必须使用这个方法 docs.djangoproject.comen3.0topicsdbexamplesmany_to_one。如果你想避免创建一个数据库表,而利用Django的选择字段,你可以使用以下方法 延长.
由于一周有7个固定的日子,我会更倾向于第二种方法,而不是创建一个DB表,以及不必要的DB查询。
投票
在不知道你最终要对模型做什么的情况下,很难说出最好的结构,然而,我不明白为什么你不能有一个涵盖所有内容的单一Session模型--像这样。
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()
你可以通过计算一个会话的出现次数来找到重复出现的会话,一旦你对类型或其他字段应用了一个过滤器。这将使你的模型结构保持简洁,并在一个地方给你足够的信息,以便根据需要进行过滤、注释等。