2012-03-03 7 views
6

से अधिक हैं मैं एक मॉडल है जो इस तरह की एक घटना का वर्णन करता है:Django: सही ढंग से डेटा पुनः प्राप्त जहां दिनांक और समय अब ​​

class Event(models.Model): 
    date = models.DateField() 
    time = models.TimeField() 

मैं भविष्य की सभी घटनाओं को पुनः प्राप्त करना चाहते हैं (यानी now.date() से अधिक की तारीख)। हालांकि अगर आज की तारीख है, तो मैं आज के कार्यक्रमों को now.time() से अधिक समय के साथ पुनर्प्राप्त करना चाहता हूं।

यह मैं क्या कर रहा हूँ है:

events = Event.objects.filter(date__gte=now.date()).filter(time__gte=now.time()).order_by('-date') 

जहां now = datetime.datetime.now()

लेकिन यह गलत है, क्योंकि यह मुझे एक खाली सेट देता है अगर केवल घटना कल है और अपने समय वर्तमान समय की तुलना में कम है (उदाहरण के लिए यदि घटना कल 09:00 बजे है और आज 1 9:00 है)

क्या यह django में संभव है?

पीएस: मैं सेट के माध्यम से पुनरावृत्ति से बचना चाहता हूं।

+1

क्यों आप की तारीख और समय बचाने के लिए दो अलग-अलग क्षेत्रों का उपयोग कर रहे हैं? क्यों न केवल एक डेटाटाइम क्षेत्र? इस तरह आप बस दो के बजाय एक फ़ील्ड से पूछ सकते हैं। –

+3

@pastylegs मान लीजिए कि आप समय को अंतिम रूप देने से पहले किसी घटना के दिन का निर्णय लेते हैं। आप समय को मध्यरात्रि (या अन्य) पर सेट कर सकते हैं ताकि यह पता चल सके कि समय ज्ञात नहीं था, लेकिन अलग-अलग समय क्षेत्र और स्टोर को स्टोर करना अधिक सुविधाजनक हो सकता है। नकारात्मकता यह है कि यह ओप की तरह अधिक अजीब सवाल करता है। – Alasdair

+0

उस बारे में नहीं सोचा था - अच्छा बिंदु –

उत्तर

9

Q ऑब्जेक्ट्स का उपयोग करें, जो आपको OR कथन के साथ प्रश्न करने की अनुमति देता है।

from django.db.models import Q 
Events = Event.objects.filter(Q(date=now.date(),time__gte=now.time())|Q(date__gt=now.date())).order_by('-date') 

ध्यान दें कि आप time मैदान पर सॉर्ट करने के लिए और साथ ही चाहते हो सकता है:

order_by('-date', '-time') 
+0

मैंने क्यू ऑब्जेक्ट का उपयोग करने की कोशिश की, लेकिन मैं इसे सही तरीके से नहीं कर रहा था। आपने जो किया वह सही है। धन्यवाद! 'django.db.models से Q' आयात लेकिन इस अनावश्यक अगर आप सिर्फ DateTimeField का उपयोग करें: Django 1.5.1 के लिए – xpanta

+2

अद्यतन ' घटनाओं = Event.objects.filter (date__gt = datetime.now()) .order_by ('- date') ' –

+1

@RyanAllen मुझे नहीं लगता कि Django 1.5 मूल प्रश्न या उत्तर को प्रभावित करता है। Django के पिछले संस्करणों में 'डेटटाइमफ़िल्ल्ड' भी था, लेकिन ओपी को उपरोक्त टिप्पणियों में चर्चा के अनुसार दो अलग-अलग क्षेत्रों का उपयोग करना पड़ा। – Alasdair

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