답변:
사용하다
Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])
또는 월 단위로 현명하게 필터링하려고하는 경우 :
Sample.objects.filter(date__year='2011',
date__month='01')
Bernhard Vallant가 말했듯이, 제외하는 쿼리 세트를 원하면 gt / lt (보다 큼 /보다 큼)를 사용하는 솔루션을specified range ends
고려해야 합니다.
__range
또한 테두리 를 포함 한다고 말하면 sql 's와 같이 BETWEEN
테두리를 포함하고 싶지 않다면 테두리를 포함하지 않으려면 내 gt / lt 솔루션과 함께 가야합니다 ...
order_by
에서 생성 QuerySet
된 것 이상 을 사용 하는 경우를 기준으로합니다 filter
. 나는 몇 년 동안 장고를 사용하지 않았습니다.
djangofilter
를 datetime.date
객체 와 함께 사용할 수 있습니다 .
import datetime
samples = Sample.objects.filter(sampledate__gte=datetime.date(2011, 1, 1),
sampledate__lte=datetime.date(2011, 1, 31))
필터를 사용하여 장고 범위를 수행하는 경우 날짜 개체와 날짜 시간 개체의 차이점을 알아야합니다. __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
- 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)
가 작동하지 않는다는 것인데, 이는 직관적으로 반 직관적 인 IMHO입니다.
보다 유연하게하기 위해 아래와 같이 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