首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于筛选日期范围的Django查询

用于筛选日期范围的Django查询
EN

Stack Overflow用户
提问于 2022-09-01 05:55:14
回答 3查看 293关注 0票数 1

我有一个模型,其中包含日期范围,我想要过滤数据的基础上的范围日期,即我要的数据谁的日期范围是从今天的日期90天。

代码语言:javascript
复制
class MyModel(models.Model):
    name = models.CharField(max_length=255)
    start_end_date = ranges.DateTimeRangeField(validators= 
                                                       [validate_range_date_time])

因此,当我们选择页面上的开始日期时,结束日期将显示相同的日期,但我不能在今天之前连接过滤器+ timedelta(days=90),这是一个单一日期,字段是日期范围,所以我如何过滤90天后的日期范围数据。

模型将start_end_date存储为

代码语言:javascript
复制
'start_end_date': DateTimeTZRange(datetime.datetime(2022, 11, 29, 9, 15), datetime.datetime(2022, 11, 29, 10, 0),



 Mymodel.objects.filter(start_end_date__contains=timezone.now() + timezone.timedelta(days=90))

timezone.now() + timezone.timedelta(days=90) = datetime.datetime(2022, 11, 29, 22, 52, 7, 759648)

查询提供的是空集。

EN

回答 3

Stack Overflow用户

发布于 2022-09-01 06:49:48

我自己也没有使用过这个字段,但是在我从文献资料中看到的基础上,应该是这样的:

代码语言:javascript
复制
from psycopg2.extras import DateTimeTZRange

Mymodel.objects.filter(
    start_end_date__contained_by=DateTimeTZRange(
        timezone.now(),
        timezone.now() + timezone.timedelta(days=90)
    )
)

要检查从现在起90天内是否有任何start_end_date字段,您还应该传递一个日期时间范围。

编辑:

代码语言:javascript
复制
from psycopg2.extras import DateTimeTZRange

Mymodel.objects.filter(
    start_end_date__contained_by=DateTimeTZRange(
        timezone.now(),
        timezone.now() + timezone.timedelta(days=90),
    start_end_date__lower_inc=False
    )
)
票数 1
EN

Stack Overflow用户

发布于 2022-09-01 07:36:55

我想你可以更容易地设计这个模型。

代码语言:javascript
复制
class MyModel(models.Model):
    name = models.CharField(max_length=255)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

然后,您可以找到如下所示的对象。

代码语言:javascript
复制
target_time = timezone.now() + timezone.timedelta(days=90)
MyModel.objects.filter(start_date__lte = target_time).filter(end_date__gte = target_time)
票数 1
EN

Stack Overflow用户

发布于 2022-09-01 08:01:50

由于它是一个DateTimeRangeField,我认为您的结果可以通过使用startswithendswith来实现,就像这样:

代码语言:javascript
复制
max_date = timezone.now() + timezone.timedelta(days=90)
MyModel.objects.filter(start_end_date__startswith__gte=timezone.now(), start_end_date__endswith__lte=max_date)

希望能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73564800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档