如何在 Django 中按日期范围过滤查询对象?

2025-01-07 08:44:00
admin
原创
152
摘要:问题描述:我在一个模型中有一个字段,例如:class Sample(models.Model): date = fields.DateField(auto_now=False) 现在,我需要按日期范围过滤对象。如何筛选日期在1-Jan-2011和之间的所有对象31-Jan-2011?解决方案 1:使用...

问题描述:

我在一个模型中有一个字段,例如:

class Sample(models.Model):
    date = fields.DateField(auto_now=False)

现在,我需要按日期范围过滤对象。

如何筛选日期在1-Jan-2011和之间的所有对象31-Jan-2011


解决方案 1:

使用

Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])

或者如果你只是想按月过滤:

Sample.objects.filter(date__year='2011', 
                      date__month='01')

编辑

正如 Bernhard Vallant 所说,如果您想要一个排除的查询集,specified range ends您应该考虑他的解决方案,它利用 gt/lt(大于/小于)。

解决方案 2:

您可以将djangofilterdatetime.date对象一起使用:

import datetime
samples = Sample.objects.filter(sampledate__gte=datetime.date(2011, 1, 1),
                                sampledate__lte=datetime.date(2011, 1, 31))

解决方案 3:

当使用过滤器执行 django 范围时,请确保您知道使用日期对象和日期时间对象之间的区别。__range 包含日期,但如果您使用日期时间对象作为结束日期,如果未设置时间,它将不包含该天的条目。

from datetime import date, timedelta

startdate = date.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])

返回从开始日期到结束日期的所有条目,包括这些日期的条目。这是一个不好的例子,因为这是返回未来一周的条目,但您明白我的意思。

from datetime import datetime, timedelta

startdate = datetime.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])

将缺少 24 小时的条目,具体取决于日期字段的时间设置。

解决方案 4:

您可以使用datetime.timedelta在范围内的最后一个日期上添加一天,从而解决由于对象比较精度不足而导致的“阻抗不匹配”问题(如果使用范围DateTimeField/date则可能发生这种情况)。其工作原理如下:

start = date(2012, 12, 11)
end = date(2012, 12, 18)
new_end = end + datetime.timedelta(days=1)

ExampleModel.objects.filter(some_datetime_field__range=[start, new_end])

正如前面所讨论的,如果不做这样的事情,最后一天的记录将被忽略。

编辑以避免使用datetime.combine-- 与 进行比较时,坚持使用日期实例似乎更合乎逻辑DateTimeField,而不是乱用一次性(且令人困惑)的datetime对象。请参阅下面评论中的进一步解释。

解决方案 5:

您可以使用“__range”例如:

from datetime import datetime
start_date=datetime(2009, 12, 30)
end_date=datetime(2020,12,30)
Sample.objects.filter(date__range=[start_date,end_date])

解决方案 6:

为了使其更加灵活,您可以设计一个如下所示的 FilterBackend:

class AnalyticsFilterBackend(generic_filters.BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        predicate = request.query_params # or request.data for POST

        if predicate.get('from_date', None) is not None and predicate.get('to_date', None) is not None:
            queryset = queryset.filter(your_date__range=(predicate['from_date'], predicate['to_date']))

        if predicate.get('from_date', None) is not None and predicate.get('to_date', None) is None:
            queryset = queryset.filter(your_date__gte=predicate['from_date'])

        if predicate.get('to_date', None) is not None and predicate.get('from_date', None) is None:
            queryset = queryset.filter(your_date__lte=predicate['to_date'])
        return queryset

解决方案 7:

很简单,

YourModel.objects.filter(YOUR_DATE_FIELD__date=timezone.now())

对我有用

解决方案 8:

模型

date = models.DateField()

看法

def get_queryset(self):  

    fromDate = self.request.query_params.get('fromDate',None)
    toDate = self.request.query_params.get('toDate',None)
    response  = yourModel.objects.filter(date__gte=fromDate,date__lte=toDate)
    return response
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2941  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1803  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   31  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   31  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用