簡體   English   中英

Django模型中的外鍵數組

[英]Array of foreign keys in Django Model

我不確定這是最好的標題,但是我很難簡單地表述它。 基本上,我正在創建一個代表業務的模型。 其中包括地址,營業時間等。這是讓我感到震驚的營業時間。 我有我的地址

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

因此,每個公司都有一個或多個位置地址。 我正在尋找與Hours類似的方法

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

我要執行的是每個業務必須有一個7 HoursOnDay的數組-一周的每一天。 我似乎無法偶然發現明顯而優雅的方法。 有沒有一種在Django中建模的好方法?

使用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天,則可以選中“ 限制要創建的模型實例數”

我遇到了類似的問題(一天中的每個小時都需要一堆字段),並得出以下結論:

最簡單的方法是不要嘗試做任何明智的事情。 如果您需要一堆字段七次,只需復制粘貼字段並給它們提供不同的后綴或前綴。 例如:

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()整個工作日中通過迭代來做一些聰明的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM