【问题标题】:How to store multiple values on a django model field如何在 django 模型字段上存储多个值
【发布时间】:2020-05-07 14:32:43
【问题描述】:

我有一个模型,我可以在其中存储我健身房的重复训练。

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 支持。 有没有特定的 django 方法可以做到这一点?也许存储带有逗号分隔值的字符域? 我不需要按那个字段搜索。

每周都会有一个 cronjob 读取这个模型并在另一个模型上创建每个会话的实例。 (我需要每个会话作为自定义实例:教师替换、会话花名册、会话状态 - 我可能会在银行假日或其他原因取消单个会话)。 所以这个“RecurringSessions”将是我存储每周生成的会话信息的地方。 我最初编写的方式将在同一会话的一周中的每一天都有一个模型实例,但我想将它们分组在同一个实例中,因为我认为它看起来更好并且可能更容易设置老师块。 或者,我可以为每个会话存储一个带有多个日期/时间值的 dict 的 json,但这会使确保如果 cronjob 运行两次,则该类不会被重复变得更加困难。

现在,为避免这种情况,我的日程表模型中有一个 UniqueConstraint,其中包含“day”、“time”和“room”字段

使用 Django 3.0.6、Python 3.8.2 和 MySQL 8.0.20。

谢谢

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    您正在尝试建立多对一关系,因此您必须使用此方法docs.djangoproject.com/en/3.0/topics/db/examples/many_to_one,或者如果您想避免创建数据库表并使用 Django 的选择字段,您可以使用这个extension

    由于一周有 7 天,我更喜欢第二种方法,而不是创建数据库表和不必要的数据库查询。

    【讨论】:

    • 谢谢,我同意此时不需要额外的数据库查询。所以这个扩展所做的几乎就是在一个字符域中保存一个选项列表,对吧?使用这个扩展比自己做有什么优势?
    • 这个库比简单的day.split(",") 更复杂。例如,它有验证器和 Django 管理集成。你当然可以自己做,但你必须注意几个你现在可能没有预料到的错误检查方面。
    【解决方案2】:

    如果不知道您最终要使用该模型做什么,很难说出最佳结构,但是,我不明白为什么您不能拥有一个涵盖所有内容的 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()
    

    将过滤器应用于类型或其他字段后,您可以通过计算会话的出现次数来找到重复会话。这将使您的模型结构保持简洁,并在一个地方为您提供足够的信息,以便根据需要进行过滤、注释等。

    【讨论】:

    • 感谢您的回复!我刚刚更新了我的问题,以准确解释我是如何使用这些信息的。
    猜你喜欢
    • 2016-02-11
    • 2017-08-26
    • 2018-02-16
    • 2010-09-28
    • 2017-09-20
    • 2022-01-04
    • 1970-01-01
    • 2015-04-19
    • 2017-01-10
    相关资源
    最近更新 更多