Django에서 날짜 범위별로 쿼리 개체를 필터링하려면 어떻게 해야 합니까?
한 모델에 다음과 같은 필드가 있습니다.
class Sample(models.Model):
date = fields.DateField(auto_now=False)
날짜 범위를 기준으로 개체를 필터링해야 합니다.
다음 사이에 날짜가 있는 모든 개체를 필터링하려면 어떻게 해야 합니까?1-Jan-2011
그리고.31-Jan-2011
?
사용하다
Sample.objects.filter(date__range=["2011-01-01", "2011-01-31"])
또는 월별로 필터링하려는 경우:
Sample.objects.filter(date__year='2011',
date__month='01')
편집
Bernhard Valant가 말했듯이, 만약 당신이 쿼리셋을 제외하기를 원한다면specified range ends
gt/lt(보다 작음/보다 작음)를 사용하는 솔루션을 고려해야 합니다.
오브젝트와 함께 django를 사용할 수 있습니다.
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])
는 시작 날짜에서 종료 날짜까지의 모든 엔트리를 반환합니다.이 날짜의 엔트리를 포함합니다.이것은 앞으로 일주일 후에 엔트리를 반환하는 것이기 때문에 나쁜 예이지만, 그 취지는 알 수 있습니다.
from datetime import datetime, timedelta
startdate = datetime.today()
enddate = startdate + timedelta(days=6)
Sample.objects.filter(date__range=[startdate, enddate])
는 날짜 필드의 설정 시간에 따라 24시간 분량의 엔트리가 누락됩니다.
의 정밀도가 부족하여 발생하는 '임피던스 미스매치'를 회피할 수 있습니다.DateTimeField/date
datetime.datelta를 사용하여 범위의 마지막 날짜에 날짜를 추가하여 오브젝트 비교(범위를 사용하는 경우 발생할 수 있습니다).이것은 다음과 같이 동작합니다.
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
물건들.아래의 코멘트에서 자세한 설명을 참조해 주세요.
다음과 같이 "_range"를 사용할 수 있습니다.
from datetime import datetime
start_date=datetime(2009, 12, 30)
end_date=datetime(2020,12,30)
Sample.objects.filter(date__range=[start_date,end_date])
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
심플하고
YourModel.objects.filter(YOUR_DATE_FIELD__date=timezone.now())
효과가 있다
모델
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
언급URL : https://stackoverflow.com/questions/4668619/how-do-i-filter-query-objects-by-date-range-in-django
'source' 카테고리의 다른 글
JSR의 용도와 용도는 무엇입니까? (0) | 2023.01.09 |
---|---|
System.out.println을 사용하지 않는 한 끝이 없는 것처럼 보이는 루프가 종료됩니다. (0) | 2022.12.25 |
3306 이외의 포트를 사용하도록 mariadb docker-compose 파일을 설정하려면 어떻게 해야 합니까? (0) | 2022.12.25 |
변수 === 정의되지 않은 변수 대 변수 유형 === "변수" (0) | 2022.12.25 |
SQL 쿼리 문자열을 자리 표시자로 바꾸기 (0) | 2022.12.25 |