python - मैं Django में डेटटाइमफ़िल्ल्ड की तिथि कैसे फ़िल्टर कर सकता हूं?




7 Answers

इस तरह के लुकअप django.views.generic.date_based में निम्नानुसार कार्यान्वित किए django.views.generic.date_based हैं:

{'date_time_field__range': (datetime.datetime.combine(date, datetime.time.min),
                            datetime.datetime.combine(date, datetime.time.max))} 

क्योंकि यह काफी verbose है __date ऑपरेटर का उपयोग कर वाक्यविन्यास में सुधार करने की योजना है। अधिक जानकारी के लिए " # 9596 डेटटाइमफ़ील्ड की तुलना किसी दिनांक में करना बहुत कठिन है " की जांच करें।

मैं DateTimeField को डेट के साथ तुलना करने की कोशिश कर रहा हूं। मेरा मतलब:

MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))

मुझे एक उत्तर के रूप में एक खाली क्वेरीसेट सूची मिलती है क्योंकि (मुझे लगता है) मैं समय पर विचार नहीं कर रहा हूं, लेकिन मुझे "किसी भी समय" चाहिए।

क्या ऐसा करने के लिए Django में कोई आसान तरीका है?

मेरे पास समय-समय पर निर्धारित समय है, यह 00:00 नहीं है।




आईपीथॉन के टाइमिट फ़ंक्शन के साथ परिणाम यहां दिए गए हैं:

from datetime import date
today = date.today()

timeit[Model.objects.filter(date_created__year=today.year, date_created__month=today.month, date_created__day=today.day)]
1000 loops, best of 3: 652 us per loop

timeit[Model.objects.filter(date_created__gte=today)]
1000 loops, best of 3: 631 us per loop

timeit[Model.objects.filter(date_created__startswith=today)]
1000 loops, best of 3: 541 us per loop

timeit[Model.objects.filter(date_created__contains=today)]
1000 loops, best of 3: 536 us per loop

लगता है कि तेजी से लगता है।




अब Django के पास विकास संस्करण में तिथियों के खिलाफ __date ऑब्जेक्ट्स पूछने के लिए __date फ़िल्टर है। इस प्रकार, यह जल्द ही 1.9 में उपलब्ध होगा।







यहां एक दिलचस्प तकनीक है - मैंने शुरुआती प्रक्रिया को लीवरेज किया है जैसा कि डीजेगो के साथ MySQL पर लागू किया गया है ताकि केवल तारीख के माध्यम से केवल डेटाटाइम को देख सकें। असल में, जब Django डेटाबेस में लुकअप करता है तो उसे DATETIME MySQL स्टोरेज ऑब्जेक्ट के लिए एक स्ट्रिंग रूपांतरण करना होता है, ताकि आप उस पर फ़िल्टर कर सकें, तिथि के टाइमस्टैंप हिस्से को छोड़कर - इस तरह% LIKE% केवल तारीख से मेल खाता है ऑब्जेक्ट और आपको दी गई तारीख के लिए हर टाइमस्टैम्प मिलेगा।

datetime_filter = datetime(2009, 8, 22) 
MyObject.objects.filter(datetime_attr__startswith=datetime_filter.date())

यह निम्नलिखित क्वेरी करेगा:

SELECT (values) FROM myapp_my_object \ 
WHERE myapp_my_object.datetime_attr LIKE BINARY 2009-08-22%

इस मामले में पसंद की तारीख तारीख के लिए सबकुछ से मेल खाती है, चाहे टाइमस्टैम्प चाहे। मूल्यों सहित:

+---------------------+
| datetime_attr       |
+---------------------+
| 2009-08-22 11:05:08 |
+---------------------+

उम्मीद है कि यह तब तक मदद करता है जब तक Django समाधान के साथ बाहर नहीं आ जाता!




Django में 1.7.6 काम करता है:

MyObject.objects.filter(datetime_attr__startswith=datetime.date(2009,8,22))



Model.objects.filter(datetime__year=2011, datetime__month=2, datetime__day=30)



Related

python django datetime filter django-queryset