【问题标题】:Django filter datetime based on month and day only in a rangeDjango仅在一个范围内根据月份和日期过滤日期时间
【发布时间】:2021-04-16 14:18:59
【问题描述】:

我正在尝试过滤某个范围内的模型对象。如果我考虑这一年,那么我可以像下面这样做得很好:

today = datetime.date.today()
start_date = today + datetime.timedelta(days = 1)
end_date = today + datetime.timedelta(days = 7)

for required_day in required_days:
        filter_dict.update({
                        required_day + "__range" : [start_date, end_date]
                        })

list_of_Q = [Q(**{key: val}) for key, val in filter_dict.items()]

if list_of_Q:
    model_objects = Model.objects.filter(reduce(operator.or_, list_of_Q))

但我想做的是仅按datetimedaymonth 的值进行过滤。

我尝试如下:

for required_day in required_days:
        filter_dict.update({
                        required_day + "__month__gte" : start_date.month,
                        required_day + "__day__gte" : start_date.day,
                        required_day + "__month__lte" : end_date.month,
                        required_day + "__day__lte" : end_date.day,
                        })

但我在这里没有得到正确的值。我该如何纠正它?

【问题讨论】:

    标签: django django-queryset django-orm django-filters


    【解决方案1】:

    问题是在list_of_Qfilter_dict 中的每个项目都是单独考虑的。所以当我在list_of_Q 上使用reduce 时,它会分别考虑required_daystart_dateend_date 进行过滤。

    所以我写的解决方案如下:

    filter_list = []
    
    for required_day in required_days:
        filter_list.append(Q(**{
                        required_day + "__month__gte" : start_date.month,
                        required_day + "__day__gte" : start_date.day,
                        required_day + "__month__lte" : end_date.month,
                        required_day + "__day__lte" : end_date.day,
                        }))
    
    if filter_list:
        #continue with the logic
    

    现在这会为每个 required_day 整体添加 Q 对象。

    【讨论】:

      猜你喜欢
      • 2015-04-10
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2017-07-29
      • 2016-11-25
      • 2020-02-15
      • 1970-01-01
      相关资源
      最近更新 更多