簡體   English   中英

Django如何按日期范圍過濾查詢對象?

[英]How do I filter query objects by date range in Django?

我在一個 model 中有一個字段,例如:

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

現在,我需要按日期范圍過濾對象。

如何過濾日期在1-Jan-201131-Jan-2011之間的所有對象?

使用

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(大於/小於)。

您可以將django 的filterdatetime.date對象一起使用

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

在使用過濾器執行 Django 范圍時,請確保您知道使用日期對象與日期時間對象之間的區別。 __range 包含日期,但如果您使用 datetime 對象作為結束日期,則如果未設置時間,它將不包括當天的條目。

from datetime import date, timedelta

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

返回從 startdate 到 enddate 的所有條目,包括這些日期的條目。 不好的例子,因為這是在未來一周返回條目,但你會得到漂移。

from datetime import datetime, timedelta

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

將丟失 24 小時的條目,具體取決於日期字段的時間設置。

您可以通過使用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對象混淆。 請參閱下面的評論中的進一步解釋。

為了讓它更靈活,你可以設計一個 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

例如,您可以使用“__range”:

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

很簡單,

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

為我工作

Model

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

今天仍然有意義。 你也可以這樣做:

import dateutil
import pytz

date = dateutil.parser.parse('02/11/2019').replace(tzinfo=pytz.UTC)

暫無
暫無

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

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