簡體   English   中英

Django 查詢過濾日期范圍

[英]Django query to filter date range

我有一個 model ,其中包含我想根據范圍日期過濾數據的日期范圍,即我想要日期范圍是從今天起 90 天的數據。

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    start_end_date = ranges.DateTimeRangeField(validators= 
                                                       [validate_range_date_time])

因此,當我們 select 頁面上的開始日期時,結束日期將填充相同的日期,但我不能僅按今天日期 + timedelta(days=90) 連接過濾器,這是一個單一的日期,字段是日期范圍,那么我該如何過濾從現在起 90 天后的日期范圍數據。

model 將 start_end_date 存儲為

'start_end_date': DateTimeTZRange(datetime.datetime(2022, 11, 29, 9, 15), datetime.datetime(2022, 11, 29, 10, 0),



 Mymodel.objects.filter(start_end_date__contains=timezone.now() + timezone.timedelta(days=90))

timezone.now() + timezone.timedelta(days=90) = datetime.datetime(2022, 11, 29, 22, 52, 7, 759648)

查詢給出空集

我自己沒有使用過這個字段,但是根據我從文檔中讀到的內容,它應該是這樣的:

from psycopg2.extras import DateTimeTZRange

Mymodel.objects.filter(
    start_end_date__contained_by=DateTimeTZRange(
        timezone.now(),
        timezone.now() + timezone.timedelta(days=90)
    )
)

要檢查從現在起 90 天內是否有任何start_end_date字段,您還應該傳遞一個日期時間范圍。




編輯:

from psycopg2.extras import DateTimeTZRange

Mymodel.objects.filter(
    start_end_date__contained_by=DateTimeTZRange(
        timezone.now(),
        timezone.now() + timezone.timedelta(days=90),
    start_end_date__lower_inc=False
    )
)

我認為您可以更輕松地設計 model。

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

然后你可以找到類似下面的對象。

target_time = timezone.now() + timezone.timedelta(days=90)
MyModel.objects.filter(start_date__lte = target_time).filter(end_date__gte = target_time)

由於它是DateTimeRangeField ,我認為您的結果可以通過使用startswithendswith來實現,就像這樣:

max_date = timezone.now() + timezone.timedelta(days=90)
MyModel.objects.filter(start_end_date__startswith__gte=timezone.now(), start_end_date__endswith__lte=max_date)

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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