2011-12-21 70 views
8

我試圖按日期篩選用戶,但不能直到我可以在db中找到用戶的第一個和最後一個日期。雖然我可以在稍後將腳本過濾掉,但我想從一開始就使用Django的distinct,因爲它顯着減少了。我試圖Django - 從時間戳中獲得截然不同的日期

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

但由於install_timetimestamp,它包括日期和時間(我真的不關心)。因此,它唯一篩選出的日期是我們可以檢索多個用戶的安裝日期但不是時間的日期。

任何想法如何做到這一點?我正在使用Django 1.3.1,Postgres 9.0.5以及最新版本的psycopg2來運行它。

編輯:我忘了補充的install_time數據類型:

install_time = models.DateTimeField() 

編輯2:下面是Postgres的外殼後的輸出,與我想要的東西快速解釋和說明:

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到查詢直接寫自Manager.raw返回一個RawQuerySet,IMO,這比僅僅手動編寫SQL查詢和迭代更糟。

+1

http://stackoverflow.com/questions/3388559/django-model-group-by-datetimes-date – thatwasbrilliant 2011-12-21 22:29:18

+0

@thatwasbrilliant這正是可能的重複我正在尋找;謝謝!有點奇怪,它只花了30分鐘,當它在谷歌花了2小時w /沒有結果。 – Edwin 2011-12-21 22:57:02

+1

您需要掌握Google技能:) – thatwasbrilliant 2011-12-22 00:27:29

回答

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

感謝您閱讀@ till-backhaus的代碼片段;我需要這個爲另一個項目。 – 2011-12-22 06:11:51

+0

這是我嘗試保持最新的版本:http://stackoverflow.com/a/8746532/246241 – tback 2014-12-17 09:34:36

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分鐘內搜索到谷歌找不到答案,所以您的問題仍然有用。你應該接受這個答案,並讓它成爲:)下次有人使用你的語言來搜索這個問題,這個Q會在谷歌上出現。 – 2011-12-21 23:44:53

+0

@YujiTomita這就是爲什麼我要關閉,而不是刪除。我仍然在Google上顯示封閉的答案。 – Edwin 2011-12-22 15:24:54