簡體   English   中英

Django:如何在不設置年份的情況下按日/月范圍過濾

[英]Django: how to filter by day/month range without setting the year

我有一門課程 Model,但想在其上添加一個可用的期間日期(選項),但不考慮年份。

所以我可以:

  • 存儲 2 個日期並且不會考慮課程中的年份 model
  • 或在課程 model 上存儲 4 個數字(from_day、from_month、to_day、to_month)

首先,我不知道什么是最好的解決方案(要存儲什么類型的數據,日期還是數字?)其次,我不知道以后如何通過檢查實際日期進行過濾。

如果課程中有日期范圍,例如: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.

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