2016-10-03 43 views
1

我存儲在我的數據庫中的對象,象這樣一個timefield:噹噹前時間處於兩個TimeField之間的Django過濾器值

class MyClass(models.Model): 

    start_time = models.TimeField(null=True, blank=True) 
    stop_time = models.TimeField(null=True, blank=True) 

的想法在這裏是查詢一個端點時,服務器將返回唯一對象當前時間在start_time和stop_time之間。

注意:start_time和stop_time是一天中的任意時間,可以跨越午夜,但絕不會超過24小時。

我已經試過

currentTime = datetime.now().time() 
MyClass.objects.filter(stop_time__gte=currentTime, start_time__lte=currentTime) 

但這並不佔當次跨越午夜。

我確定必須有一個簡單的解決方案,但網絡搜索已經沒有結果。有沒有人知道這樣做的好方法?

回答

2

經過多次挖掘,我發現這需要兩個查詢:一個用於開始時間小於停止時間(常見情況),一個用於大於停止時間(非常見,午夜之後)。

下面是代碼:

currentTime = datetime.now().time() 

#Returns a list of menus that have start times less than their stop times 
list_1 = MyClass.objects.filter(Q(start_time__lte=F('stop_time')), Q(start_time__lte=currentTime), stop_time__gte=currentTime) 

#Returns the menus that have start times greater than their stop times (span midnight) 
list_2 = MyClass.objects.filter(Q(start_time__gt=F('stop_time')), Q(start_time__lte=currentTime) | Q(stop_time__gte=currentTime)) 

concat_list = list_1 | list_2 
concat_list = concat_list.order_by('-priority') 

由於我們使用 「|」要連接列表,我們可以保留與原始列表相同的功能,例如「order_by()」。如果要連接的數據來自相同的模型集,則只有這種情況。

參考文獻:

Django After Midnight Business Hours TimeField Comparison Error

How to combine 2 or more querysets in a Django view?

+2

只是澄清'MyClass.objects.filter(...)'不返回一個列表,它會返回一個QuerySet和你正在執行** OR **操作這些查詢集,它將返回一個新的查詢集。 [order_by()](https://docs.djangoproject.com/en/1.10/ref/models/querysets/#order-by)是Querysets的一種方法。 –

+0

這確實是兩個相當困難的查詢。如果你看它,你有多個OR條件和聯合,所有這些都很難在Mysql或sqlite等低端數據庫上優化。但是不知道爲什麼你不能爲這些值設置一個日期,我不能改變我的回答 – e4c5

+1

@ e4c5 - 我可能會理解這個錯誤,但我的理解是,通過使用特定的日期值,我限制自己的日子附加到那些時間,對嗎?我單獨使用時間值的原因是他們每天堅持不懈,我不想爲了保持系統正常運行而更新日期值。 更清楚了嗎? –

相關問題