【问题标题】:django: query objects with hour in certain rangedjango:查询特定范围内小时的对象
【发布时间】:2015-11-02 15:48:17
【问题描述】:

我想在一定的时间范围内(比如 9 到 12)选择我的数据库中的所有对象。现在,我正在这样做:

my_range = range(9,12)
excluded_range = [x for x in range(24) if not x in my_range]

selected_objects = MyModel.objects.all()
for hour in excluded_range:
    selected_objects = selected_objects.exclude(datetimefield__hour=hour)

有没有办法只使用查询? (使用 django 1.7)

【问题讨论】:

    标签: python django datetime django-queryset


    【解决方案1】:

    这可以通过使用reduce 的以下单行来完成:

    my_range = range(9, 12)
    
    query = reduce(lambda x, y: x | y, Q(field__hour=h) for h in my_range)
    
    selected_objects = Model.objects.filter(query)
    

    【讨论】:

      【解决方案2】:

      编辑:
      您的方法将针对 for 循环中的每次迭代访问数据库。
      考虑使用以下

      from django.db.models import Q
      
      queries = [Q(datetimefield__hour=hour) for hour in range(9, 12)]
      query = queries.pop()
      
      for _query in queries:
          query |= _query
      selected_objects = MyModel.objects.filter(query)
      

      【讨论】:

      • datetime__hour、datetime__minute 字段不支持 gte、lte 和 in
      • 确实如此。更新了答案,请查收。
      • 实际上,再次阅读 django 文档,我的方法并没有多次访问数据库——甚至一次也没有。查看this documentation page。如果有一种方法可以用一条线将query 中的所有元素or,那么这种方法会更有意义,至少因为它的可读性。
      • 一年后:我一直在寻找的一个班轮是reduce
      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 2013-07-23
      相关资源
      最近更新 更多