Django模型中的外键数组

时间:2014-07-27 16:48:41

标签: python django

我不确定这是最好的标题,但我很难简单地说出来。基本上,我正在创建一个代表一个企业的模型。这包括和解决,运营时间等。这是绊倒我的营业时间。我有我的地址

class Address(models.Model):
    --snip--
   Business = models.ForeignKey(BusinessInfo)

因此每个企业都有一个或多个位置地址。我希望与小时相似

class HoursOnDay(models.Model):
    open = isOpen = models.BooleanField()
    open = models.TimeField(null=True)
    closed = models.TimeField(null=True)

我想强制执行的是每个企业必须有一个7 HoursOnDay的数组 - 一周中的每一天。我似乎无法在这种明显,优雅的方式上绊倒。有没有一种好方法可以在django中对此进行建模?

2 个答案:

答案 0 :(得分:3)

使用ManyToManyField:

class HoursOnDay(models.Model):
    is_open = models.BooleanField()
    open = models.TimeField(null=True)
    closed = models.TimeField(null=True)

class Day(models.Model):
    hours = models.ManyToManyField(HoursOnDay)

class Business(models.Model):
    days = models.ManyToManyField(Day)

如果你想限制7小时和7天,你可以检查 Limit number of model instances to be created

答案 1 :(得分:1)

我遇到过类似的问题(每天每小时需要一堆字段)并得出以下结论:

最乐观的做法是不要尝试做任何聪明的事情。如果你需要一堆字段七次,只需复制粘贴字段并给它们不同的后缀或前缀。 E.g:

class Business(models.Model):
    --snip--
    monday_is_open = models.BooleanField()
    monday_opens_at = models.TimeField(null=True)
    monday_closes_at = models.TimeField(null=True)

    tuesday_is_open = models.BooleanField()
    tuesday_opens_at = models.TimeField(null=True)
    tuesday_closes_at = models.TimeField(null=True)

    wednesday_is_open = models.BooleanField()
    wednesday_opens_at = models.TimeField(null=True)
    wednesday_closes_at = models.TimeField(null=True)

    ...

    sunday_is_open = models.BooleanField()
    sunday_opens_at = models.TimeField(null=True)
    sunday_closes_at = models.TimeField(null=True)

当然美国人(和其他人?)会从周日开始,但你明白了。

遵循此方法可大大简化更新营业时间。这种方法(以及您所要求的)无法模拟每周更改开放时间,但这可能也不是您的需要。

此外,如果您关注架构规范化,请删除is_open,并使用xxx_opens_at__isnull=True, xxx_closes_at__isnull=True使用xxx_is_open=True

您仍然可以在Business.clean()的工作日内通过迭代进行智能操作。