2011-03-11 99 views
5

在基於postgresql數據庫的Django上,如何按時間過濾datetimefield,如下所示?Django:從日期時間字段查詢時間

class Foo(models.Model): 
    start_date = models.DateTimeField() 
    end_date = models.DateTimeField() 

IE:我想用「16:30」start_date和「19:00」end_date過濾Foo對象。

謝謝。

回答

2

如何在TimeField中添加? http://docs.djangoproject.com/en/dev/ref/models/fields/#timefield

否則,您需要編寫自定義查詢來利用數據庫的時間容量,因爲DateTimeFields在Django中本身不具有該功能。

您可以考慮編寫一個函數,將小時和分鐘從start_date非規範化爲新的start_time字段,然後查詢start_time字段。

+0

不錯,沒有注意到我們有一個時間領域:)謝謝! – 2011-03-11 13:36:23

+0

誰降低了這個?也許添加一個評論來說明當你使用這個解決方案時,什麼正在運行?我總是很驚訝地看到有多少人不想將數據庫非規範化。對於我而言,這種對非規範化的恐懼實際上增加了應用程序的複雜性,並且隨着應用程序變得越來越大,它們的速度變慢見http://www.agiledata.org/essays/dataModeling101.html#Denormalize – 2011-03-16 12:45:41

0

嘗試

Foo.objects.filter(start_date = MyDate1, end_date = MyDate2) 

其中MyDate1MyDate2是你定義datetime對象。它應該工作,對吧?

+0

唉「16:30」是一個Time對象,否則我沒有問題。 – Hellnar 2011-03-11 13:25:13

1

解決我自己的問題:

def query_by_times(start_hour, start_min, end_hour, end_min): 
     query = 'EXTRACT(hour from start_date) = %i and EXTRACT(minute from start_date) = %i and EXTRACT(hour from end_date) = %i and EXTRACT(minute from end_date) = %i' % (start_hour, start_min, end_hour, end_min) 
     return Foo.objects.extra(where=[query]) 
+1

請記住,任何正在執行函數調用的查詢都會隨着記錄數量的增加而減慢。在某些時候,如果您發現速度減慢,反規範化應該爲讀取提供速度優勢。 – 2011-03-12 15:08:09

-1

我認爲你需要使用範圍[1]。

[1] http://docs.djangoproject.com/en/1.2/ref/models/querysets/#range

1

在您的情況,數據庫標準化看起來像THEBEST解決方案,因爲執行時間和系統負載會隨着你的相關的數據庫表保存更多的記錄...

另一種解決方案來做到這一點不使用數據庫文件管理器功能使用過濾器旁邊的λ

from datetime import time 
records = Foo.objects.all() 
filtered = filter(lambda x: (time(16,30)==x.start_date.time() and time(19,0)==x.end_date.time()), records) 

但是,在大型數據集上使用它需要太多的時間和系統資源。

相關問題