我不确定这是最好的标题,但我很难简单地说出来。基本上,我正在创建一个代表一个企业的模型。这包括和解决,运营时间等。这是绊倒我的营业时间。我有我的地址
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中对此进行建模?
答案 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()
的工作日内通过迭代进行智能操作。