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

1日の特定の時刻が必要な場合は、datetime.datetime.combine()クラスメソッド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

これを行うための最良の方法は、本当にDBに変換を実行させたい場合(そして、これは他のことに適用できます。一般に、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')

これの欠点は、DBに依存しなくなったことです。そのため、RDBMSを変更するときは、コードを変更する必要があります。利点は、モデルのプロパティとは異なり、値を使用できることです。

于 2012-08-22T08:15:43.423 に答える
0

私はUNIX_TIMESTAMPに精通していませんが、Djangoに関して:Djangoモデルでプロパティとして計算フィールドを作成してみませんか

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