2011-12-21 12 views
8

मैं आज तक उपयोगकर्ताओं को फ़िल्टर करने की कोशिश कर रहा हूं, लेकिन जब तक मैं डीबी में उपयोगकर्ताओं की पहली और अंतिम तारीख नहीं ढूंढ पाता। जबकि मैं अपनी स्क्रिप्ट को बाद में डुप्लिकेट कर सकता हूं, मैं इसे Django के distinct का उपयोग करके शुरुआत से ही करना चाहता हूं क्योंकि यह काफी कम हो जाता है। मैंDjango - टाइमस्टैम्प से अलग तिथियां प्राप्त करें

User.objects.values('install_time').distinct().order_by() 

की कोशिश की लेकिन जब से install_time एक timestamp है, यह तारीख और समय (जो मैं वास्तव में परवाह नहीं है) भी शामिल है। नतीजतन, केवल फ़िल्टर करने वाले लोग ही तिथियां हैं जहां हम एकाधिक उपयोगकर्ताओं की इंस्टॉल तिथियां पुनर्प्राप्त कर सकते हैं लेकिन समय नहीं।

कोई विचार यह कैसे करना है? मैं Django 1.3.1, पोस्टग्रेस 9.0.5, और psycopg2 का नवीनतम संस्करण का उपयोग कर इसे चला रहा हूं।

संपादित करें: यहाँ, Postgres खोल से कुछ नमूना उत्पादन है जो मैं चाहता की एक त्वरित विवरण के साथ:

install_time = models.DateTimeField() 

संपादित करें 2: मैं install_time के डेटा प्रकार जोड़ने के लिए भूल गया

2011-09-19 00:00:00 
2011-09-11 00:00:00 
2011-09-11 00:00:00 <--filtered out by distinct() (same date and time) 
2011-10-13 06:38:37.576 
2011-10-13 00:00:00 <--NOT filtered out by distinct() (same date but different time) 

मैं Manager.raw के बारे में पता कर रहा हूँ, लेकिन यदि उपयोगकर्ता django.db.connection.cursor 012,354,852 के बाद से सीधे क्वेरी लिखने के लिए होगाRawQuerySet देता है जो, आईएमओ, मैन्युअल रूप से SQL क्वेरी लिखने और पुनरावृत्त करने से भी बदतर है।

+1

http://stackoverflow.com/questions/3388559/django-model-group-by-datetimes-date – thatwasbrilliant

+0

@thatwasbrilliant यही था की संभावित डुप्लिकेट मैं को ढूंढ रहा था; धन्यवाद! इस तरह की अजीब बात यह है कि एसओ पर केवल 30 मिनट लग गए जब Google डब्ल्यू/नतीजे पर 2 घंटे लगे। – Edwin

+1

आपको अपने Google कौशल पर काम करने की ज़रूरत है :) – thatwasbrilliant

उत्तर

7

जब बड़े डेटासेट itertools.group_by पर रिपोर्ट कर बहुत धीमी गति से हो सकता है। उन मामलों में मैं बनाने में postgres समूहीकरण संभाल:

truncate_date = connection.ops.date_trunc_sql('day','timestamp') 
qs = qs.extra({'date':truncate_date}) 
return qs.values('date').annotate(Sum('amount')).order_by('date') 
+0

स्निपेट @ तक-बैकहॉस के लिए धन्यवाद; मुझे यह एक और परियोजना के लिए जरूरी था। –

+0

यह वह संस्करण है जिसे मैं अद्यतित रखने का प्रयास करता हूं: http://stackoverflow.com/a/8746532/246241 – tback

0

मैंने इसे बंद करने के लिए वोट दिया है क्योंकि यह this question का डुप्लिकेट है, इसलिए अगर आप लिंक पर जाना नहीं चाहते हैं, तो nosklo की सौजन्य से यह जवाब है।


सिर्फ तारीख को निकालने के लिए एक छोटे से समारोह बनाएँ: डीईएफ़ extract_date (इकाई): वापसी entity.start_time.date()

तो आप कर सकते हैं 'एक इकाई से प्रारंभ दिनांक निकालता है' itertools.groupby के साथ उपयोग करें:

from itertools import groupby 

entities = Entity.objects.order_by('start_time') 
for start_date, group in groupby(entities, key=extract_date): 
    do_something_with(start_date, list(group)) 
+0

यह अभी भी आपके प्रश्न के लिए उपयोगी है क्योंकि आपको 30 मिनट खोज Google के साथ जवाब नहीं मिला। आपको यह जवाब स्वीकार करना चाहिए और इसे होने देना :) अगली बार जब कोई इस समस्या को खोजने के लिए आपकी भाषा का उपयोग करता है, तो यह क्यू Google पर आ जाएगा। –

+0

@YujiTomita यही कारण है कि मैं बंद कर रहा हूं, हटा नहीं रहा हूं। मेरे पास अभी भी Google पर बंद उत्तरों बंद हैं। – Edwin

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