Answers:
用
Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])
或者,如果您只是想按月过滤:
Sample.objects.filter(date__year='2011',
date__month='01')
正如伯恩哈德Vallant说,如果你想查询集去掉了specified range ends
,你应该考虑自己的解决方案,它采用GT / LT(大于/小于号)。
__range
包括边界(如sql的边界BETWEEN
),如果您不希望包括边界,则必须使用我的gt / lt解决方案……
order_by
上述生成QuerySet
的filter
。我多年没有使用Django。
您可以对对象使用djangofilter
:datetime.date
import datetime
samples = Sample.objects.filter(sampledate__gte=datetime.date(2011, 1, 1),
sampledate__lte=datetime.date(2011, 1, 31))
使用过滤器进行Django范围设置时,请确保您知道使用日期对象与日期时间对象之间的区别。__range是日期中包含的内容,但是如果您使用datetime对象作为结束日期,则如果未设置时间,它将不包括该天的条目。
startdate = date.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])
返回从开始日期到结束日期的所有条目,包括那些日期的条目。不好的例子,因为这将在未来一周返回条目,但您会遇到麻烦。
startdate = datetime.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])
根据日期字段的设置时间,将缺少24小时的输入值。
date
对象: >>> from datetime import date
>>> startdate = date.today()
通过使用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
-与a进行比较时,坚持日期实例似乎更合乎逻辑DateTimeField
,而不是乱扔掉(且容易混淆)datetime
对象。请参阅下面的注释中的进一步说明。
Example.objects.filter(created__range=[date(2014, 1, 1), date(2014, 2, 1)])
将不会包括在上创建的对象date(2014, 2, 1)
,如@cademan有用地解释。但是,如果您增加一天来增加结束日期,则会得到一个查询集,其中涵盖了那些丢失的对象(并且date(2014, 2, 2)
由于相同的怪癖而方便地省略了创建的对象)。这里令人烦恼的是,使用指定的“手动”范围created__gte ... created__lte=date(2014, 2, 1)
也不起作用,这绝对是违反直觉的恕我直言。
很简单
YourModel.objects.filter(YOUR_DATE_FIELD__date=timezone.now())
为我工作
为了使其更加灵活,可以设计如下的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
今天仍然有意义。您也可以这样做:
import dateutil
import pytz
date = dateutil.parser.parse('02/11/2019').replace(tzinfo=pytz.UTC)