[英]Django: how to filter by day/month range without setting the year
我有一門課程 Model,但想在其上添加一個可用的期間日期(選項),但不考慮年份。
所以我可以:
首先,我不知道什么是最好的解決方案(要存儲什么類型的數據,日期還是數字?)其次,我不知道以后如何通過檢查實際日期進行過濾。
如果課程中有日期范圍,例如:2022/12/20 到 2023/01/10,如果我們是 2023/01/18,則應排除這些課程
import datetime
today = datetime.date.today()
def get_available_courses(self):
courses = self.account.get_courses().filter(
...
)
無需設置年份,因為它應該考慮任何一年
編輯:
我嘗試了一個解決方案並且我認為它有效但它沒有:我有兩種情況:
當日期范圍不跨越新的一年時(那個正在工作“filter_not_year_crossed”)
當日期范圍跨過新年時:“filter_year_crossed”(那個還沒做,還沒找到怎么做的)
today = datetime.date.today() today_day = today.day today_month = today.month # we are by exemple the 15/02 today_day = 15 today_month = 2 filter_not_year_crossed = ( # CHECK END Q(available_end_at__month__lt=today_month) | (Q(available_end_at__month=today_month) & Q(available_end_at__day__gte=today_day)) # CHECK START ) & (Q(available_start_at__month__lt=today_month) | (Q(available_start_at__month=today_month) & Q(available_start_at__day__lte=today_day))) filter_year_crossed = ( <=== HERE Q(available_end_at__month=today_month) & Q(available_end_at__day__gte=today_day) ) is_year_crossed = (Q(available_end_at__month__lt=F('available_start_at__month')) | Q(available_end_at__month=F('available_start_at__month'), available_end_at__day__lt=F('available_start_at__day'))) filter_end = Q(available_start_at__isnull=True, available_end_at__isnull=True) | ( (is_year_crossed & filter_year_crossed) | (~is_year_crossed & filter_not_year_crossed) ) courses = courses.filter(filter_end)
當您有日期時間或日期 object 時,您可以使用__month
和__day
選項進行過濾。
像這樣:
course1 = Course(
name='Course 1',
start_date='2022-09-01',
end_date='2022-12-31'
)
course2 = Course(
name='Course 2',
start_date='2021-09-01',
end_date='2021-12-31'
)
courses = Course.objects.all()
# below will return both course1 and course2, because the year is not checked.
courses.filter(
start_date__day=1
start_date__month=9,
end_date__day=31,
end_date__month=12
)
正如您提到的,另一種選擇是將日期和月份保存在數據庫中,而不是年份。
course1 = Course(
name='Course 1',
start_day=1,
start_month=9,
end_day=31,
end_month=12
)
course2 = Course(
name='Course 2',
start_day=1,
start_month=9,
end_day=31,
end_month=12
)
today = datetime.date.today()
courses = Course.objects.all()
# below will return both course1 and course2
courses.filter(
start_day=1,
start_month=9,
end_day=31,
end_month=12
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.