什么是Django无年代日期范围的好方法

时间:2017-12-28 11:39:00

标签: django

我需要存储开始和结束日期以节省假期。 我不关心日期的一年,因为假期每年都会重复。

此外,我需要能够查询此日期以查看随机日期时间是否在范围内。即使我不希望存储多年,查询也必须明白假期可以在一年内开始,并在明年结束(即12月25日至1月4日)。

以前我将日期存储为DateTimeFields,然后迭代每个存储的假日并检查给定的目标日期是否在日期范围内。这是在Python中制作的,迫使我将QuerySets评估为列表,最后使用类似getattr(result, 'is_a_holiday', value)

的内容添加值

由于出现了性能问题,我想将其转换为注释(因此我可以使用select_related和prefetch_related数据保留queryset)并使数据库(Postgresql)执行查询部分,但后来我遇到的问题是数据库考虑年份,因此在去年或明年的假期内不考虑今年假期内的日期。

我已经尝试了django-yearlessdate并使用条件表达式和F表达式进行注释(以检查一年何时更改)但是它没有按预期工作:当有几个假期时,某些条件情况不匹配,我只是得到默认的返回值。

这个问题有哪些其他/不同的方法?

1 个答案:

答案 0 :(得分:0)

如果您不需要年份,可以在模型中创建两个单独的字段,分别保存月份和日期:

class Holiday(...):
    month = models.PositiveSmallIntegerField()
    day = models.PositiveSmallIntegerField()

然后要查找给定范围之间的假期,您可以这样做:

from_date = <datetime object>
to_date   = <datetime object>

Holiday.objects.filter(month__range[from_date.month, to_date.month], 
                       day__range[from_date.day, to_date.day]
                      )
相关问题