2011-03-11 13 views
5

ओ PostgreSQL डाटाबेस पर आधारित Django से समय, मैं कैसे नीचे के रूप में एक datetimefield के लिए समय के अनुसार फ़िल्टर कर सकते हैं?Django: पता कर रहा है datetime क्षेत्रों

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

आईई: मैं foo ऑब्जेक्ट्स को start_date और "19:00" end_date के साथ फ़िल्टर करना चाहता हूं।

धन्यवाद।

उत्तर

2

क्या एक TimeField में जोड़ने के बारे में? http://docs.djangoproject.com/en/dev/ref/models/fields/#timefield

अन्यथा आपको डेटाबेस की समय कैपेबिलिट्स का लाभ उठाने के लिए एक कस्टम क्वेरी लिखनी होगी क्योंकि डेटटाइमफ़िल्ड्स में Django में मूल रूप से वह क्षमता नहीं है।

आप एक नया start_time क्षेत्र के लिए प्रारंभ_तिथि से घंटे और मिनट denormalize के लिए और फिर start_time क्षेत्र क्वेरी एक समारोह लिखने पर विचार कर सकता है।

+0

नाइस, नोटिस नहीं किया था कि हम एक समय क्षेत्र :) धन्यवाद था! –

+0

किसने इसे कम किया? शायद यह कहने के लिए एक टिप्पणी जोड़ें कि जब आप इसे कम करते हैं तो इस समाधान के साथ क्या परेशान है? मैं हमेशा यह देखकर आश्चर्यचकित हूं कि कितने लोग अपने डेटाबेस को denormalize नहीं करना चाहते हैं। मेरे लिए denormalization का यह डर वास्तव में आवेदन जटिलता जोड़ता है और वे बड़े होने के रूप में अनुप्रयोगों को धीमा कर देता है। अफसोस "16:30" एक समय वस्तुओं है http://www.agiledata.org/essays/dataModeling101.html#Denormalize –

0

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

प्रयास करें जहां MyDate1 और MyDate2 अपने परिभाषित datetime वस्तुओं रहे हैं। यह काम करना चाहिए, है ना? मेरे अपने क्ष को

+0

देखें, नहीं तो मुझे कोई समस्या नहीं है। – Hellnar

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

ध्यान रखें कि इस तरह की फ़ंक्शन कॉल करने वाली कोई भी क्वेरी धीमी हो जाएगी क्योंकि रिकॉर्ड्स की संख्या बढ़ जाती है। किसी बिंदु पर, यदि आप धीमी गति से देखते हैं, तो denormalization को पढ़ने पर गति लाभ प्रदान करना चाहिए। –

-1

मुझे लगता है कि जो आप की जरूरत रेंज का उपयोग करता है [1]।

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

1

अपनी स्थिति में, डेटाबेस सामान्यीकरण, thebest समाधान की तरह लग रहा निष्पादन समय और सिस्टम लोड के बाद से वृद्धि होगी के रूप में अपने संबंधित डेटाबेस तालिका में अधिक रिकॉर्ड रखता है ...

एक अन्य समाधान डेटाबेस filer कार्यों का उपयोग किए बिना इस करने के लिए लैम्ब्डा साथ फिल्टर का उपयोग कर रहा है:

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) 

लेकिन एक बड़े डेटासेट पर इस का उपयोग करते हुए बहुत ज्यादा समय और सिस्टम संसाधन की आवश्यकता होगी।

संबंधित मुद्दे