簡體   English   中英

django 在日期范圍內按日期時間過濾

[英]django filter by datetime on a range of dates

我有一個帶有字段“created_at”的 model,並且我有一個日期列表。 所以,我想獲取在日期范圍內創建的所有模型。 如何?

我知道我們可以使用以下方法輕松比較日期時間和日期:

queryset.filter(created_at__startswith=date)

但是,我有一個日期范圍,那怎么辦?
讓我知道更多信息。

您可以使用范圍查找。 只需找到最低和更大的日期,然后將其應用為:

queryset.filter(created_at__range=(start_date, end_date))

您可以使用范圍例如

import datetime

first_date = datetime.date(2005, 1, 1)
last_date = datetime.date(2005, 3, 31)
queryset.filter(created_at__range=(first_date, last_date))

您可以使用__gte (大於或等於)和__lte (小於或等於)。 例如:

queryset.filter(created_at__gte=datetime.date.today())

您可以組合日期范圍字段查找:

queryset.filter(created_at__date__range=(start_date, end_date))

queryset.filter(created_at__range=(start_date, end_date)) 這將導致問題,即結束日期將是排他性的讓我們舉個例子 sql 如何將此查詢視為created_at >= "start_date 00:00:00" AND created_at <= "end_date 00:00:00"所以最好的解決方案是將最大時間添加到結束日期,即 "23:59:59" 所以它會created_at >= "start_date 00:00:00" AND created_at <= "end_date 23:59:59"所以你可以通過做

import datetime
queryset.filter(created_at__range=(
    datetime.datetime.combine(start_date, datetime.time.min),
    datetime.datetime.combine(end_date, datetime.time.max),
))

此外,如果將 1 添加到結束日期,這將是錯誤的方法,因為結束日期將為 end_date+1 00:00:00,因此查詢還將包括 end_date+1 00:00:00,這是錯誤的

還有另一個答案,我們可以將 datetimefield 更改為 datefield

queryset.annotate(Date = Cast('created_at', DateField())).filter(Date__range=(start_date,end_date))

還有另一個答案你可以玩弄它

queryset.filter(Q(created_at__range=(start_date,end_date)) | Q(created_at__icontains=end_date) )

或者

queryset.filter(Q(created_at__range=(start_date,end_date)) | Q(created_at__startswith=end_date) )

使用https://pypi.python.org/pypi/django-daterange-filter/使用日期范圍過濾器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM