2011-06-15 59 views
2

對於具有自定義BusinessHours和Events的給定業務,我需要弄清楚如何爲每個事件獲取最近的前一個工作日(比如說幾周的事件)。例如,假設一個企業在週日,週三,週五和週六有營業時間。鑑於2011年6月22日星期三下午3點開始的活動,我如何纔能有效地確定2011年6月19日星期日是此活動的最近一個工作日?下面是型號:如何確定自定義營業時間內事件的最近一個營業日?

class Business(models.Model): 
    name = models.CharField(max_length=50) 

class BusinessHours(models.Model): 
    """ 
    I realize there are better ways to store business hours, 
    but this approach is simple and serves my purposes for now. 
    However, if another schema solves the problem above more efficiently, 
    feel free to make a suggestion. 
    """ 
    business = models.ForeignKey(Business) 
    sunday_open = models.TimeField(blank=True, null=True) 
    sunday_close = models.TimeField(blank=True, null=True) 
    monday_open = models.TimeField(blank=True, null=True) 
    monday_close = models.TimeField(blank=True, null=True) 
    ... continue for each day ... 

class Event(models.Model): 
    business = models.ForeignKey(Business) 
    start = models.DateTimeField() 
    end = models.DateTimeField() 

我假設大多數工作都需要在python除了Django的發生,所以忽略了Django模型,如果它的解決方案複雜化。如果需要,我很樂意提供其他信息。提前致謝!

回答

3

你會想對你用python編寫的數據庫進行查詢。我會查看django docs關於如何進行數據庫查詢以及查找現場查詢的appendix

的基本格式可能會是這個樣子:

# Will return a list of dictionary objects for all rows with that foreign key 
# Ex: [{'business' : '3', 'monday_open' : someTime, 'monday_close' : someTime...},...] 
storeHours = BuisnessHours.objects.values().filter(business = *foreign key*) 

# You can also get your even like this 
# Ex: [{'business' : '3', 'start' : someTime, 'end' : someTime}, {'business' : '3'...] 
storeEvent = Event.objects.values().filter(business = *same foreign key as above*) 

*請注意,如果你有你想每家店保存不同的事件,它可能是件好事,在事件一個「名稱」列模型,所以你也可以基於某個事件進行查詢。此外,而不是做一個TimeField,嘗試一個DateTimeField的方式,你可以保存日期,如果你想。

當你得到你的查詢字典後,它應該很簡單,在Python中分組的開始和結束時間,看看哪些是最接近事件的範圍。爲此,我還要看看datetime module。我想看看at this question。他在查詢格式中使用列表理解來做一些非常有趣的事情。

雖然只是簡單地使用fieldlookups,但可能還有一種更有效的方法,所以我也會研究這一點。

+0

謝謝你的回答!您使用values()的建議有助於我指出正確的方向。我正在使用values_list()來生成每天的打開時間列表:[sunday_open,monday_open,tuesday_open,wednesday_open,thursday_open,friday_open,saturday_open]。通過這種方式,我可以使用當前事件的.weekday()作爲索引開始遍歷列表,直到找到前一天業務開放的時間。我仍在研究細節,但我希望在第二天或第二天提供更多細節。 – 2011-06-16 22:26:48

+0

我很高興你發現它有幫助!看起來你正在找一個很好的方法來解決它:)我期待着聽到更多關於它的信息 – 2011-06-16 23:28:28