0

我有以下查询:

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

请注意,我不想在 python 中进行格式化,因为需要完成很多上述调用。

4

3 回答 3

1

Pythondatetime.date对象没有时间组件,因此您想要的时间戳需要一点限定。如果午夜足够,您可以使用该.timetuple()方法与该time.mktime()函数一起创建时间戳:

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

如果您需要一天中的特定时间,请使用datetime.datetime.combine()类方法构造 a 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())
于 2012-08-22T08:10:05.377 回答
1

最好的方法是,如果真的希望数据库进行转换(这可能适用于其他事情,通常当您想要返回数据库中的列中不容易获得的信息时),您可以使用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')

这样做的缺点是它不再与 DB 无关,因此当您更改 RDBMS 时,您必须更改代码。好处是您可以使用值,这与模型上的属性不同。

于 2012-08-22T08:15:43.423 回答
0

我不熟悉 UNIX_TIMESTAMP,但关于 Django:Why not create a computed field as proprty at your Django Model

class Analytics(...):
    ...
    @property
    def unix_timestamp(self):
        return time.mktime(self.date.timetuple())
于 2012-08-22T08:10:58.277 回答