2012-08-22 20 views
0

我有以下查詢:檢索UNIX TIMESTAMP在Django API調用

users = Analytics.objects.values('date', 'users').order_by('date') 
[(datetime.date(2012, 8, 20), 156L), (datetime.date(2012, 8, 21), 153L),...] 

我怎麼會來到這裏的日期時間的unix時間戳?這樣做的相當於:

select concat(UNIX_TIMESTAMP(date), '000') as date, users from analytics_analytics 
1345446000000 156 
1345532400000 153 
1345618800000 153 

注意,我不想做的蟒蛇因爲有很多需要做上述呼籲的格式。

回答

1

創建一個計算字段作爲proprty要做到這一點,最好的辦法,如果真要DB進行轉換(這可當你想返回,這不是現成的,從一個數據庫中的列的信息適用於其他的事情,一般),你可以使用QuerySet.extra()函數https://docs.djangoproject.com/en/dev/ref/models/querysets/#extra這樣的:

Analytics.objects.extra(select={'timestamp': "CONCAT(UNIX_TIMESTAMP(date), '000')"}).order_by('date').values('timestamp', 'users') 

的這個下行它不再是數據庫不可知的,所以當你改變RDBMS時,你必須改變代碼。上方是你可以使用它的值,而不像模型上的屬性。

+0

太好了,謝謝你的提示! – David542

1

Python datetime.date對象沒有時間組件,所以您想要的時間戳需要一點資格。如果半夜就足夠了,你可以使用.timetuple() methodtime.mktime() function共同打造一個時間戳:

>>> import datetime, time 
>>> adate = datetime.date(2012, 8, 20) 
>>> print time.mktime(adate.timetuple()) 
1345413600.0 

如果您需要在一天的具體時間,使用datetime.datetime.combine() class method構建datetime,然後用同樣的伎倆,使它的時間戳:

>>> adatetime = datetime.datetime.combine(adate, datetime.time(12, 0)) 
>>> print time.mktime(adatetime.timetuple()) 
1345456800.0 

使用或者作爲對你的Django模型的屬性:

class Analytics(models.Model): 
    @property 
    def timestamp(self): 
     return time.mktime(self.date.timetuple()) 
0

我不熟悉UNIX_TIMESTAMP,但是對於Django的:爲什麼不能在你的Django模型

class Analytics(...): 
    ... 
    @property 
    def unix_timestamp(self): 
     return time.mktime(self.date.timetuple())