如何确定自定义营业时间内事件的最近,前一个工作日?

时间:2011-06-15 18:32:44

标签: python django database-design datetime

对于具有自定义BusinessHours和事件的特定业务,我需要弄清楚如何获取每个事件的最近的前一个工作日(比如一周的事件)。例如,假设商业在周日,周三,周五和周六有商务时间。鉴于活动于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()

我假设除了Django之外,大部分工作都需要在python中进行,所以如果它使解决方案复杂化,请忽略Django模型。如果需要,我很乐意提供更多信息。提前谢谢!

1 个答案:

答案 0 :(得分:3)

您将需要对使用python编写的数据库进行查询。我会查看关于如何进行数据库查询的django docs和fieldlookup的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。他在查询格式中使用列表理解做了一些非常有趣的事情。

有一种更有效的方法可以简单地使用fieldlookup来做到这一点,所以我也会研究它。