web-dev-qa-db-ja.com

Django queryset.values_list()の日時フィールドの文字列への変換

私は次のようなクエリセットを持っています:

qs = MyModel.objects.filter(name='me').values_list('activation_date')

ここでactivation_dateはモデルではDateTimeFieldです。このqsからExcelシートをダウンロードすると、string format。でアクティベーション日付が得られません

24
Navera

https://docs.djangoproject.com/en/2.2/ref/models/fields/#datetimefield

Datetime.datetimeインスタンスによってPythonで表される日付と時刻。

直接キャストするDateTimeFieldの文字列表現を取得できます。

str(obj)
# obj = qs[0][0] ? or qs[0][1] ?

次のような結果が得られます(DateTimeFieldはdatetime.datetimeで表されるため、この例ではdatetime.datetime.now()を使用します):

>>> now = datetime.datetime.now()
>>> str(now)
'2013-06-26 00:14:26.260524'

必要な情報が少ない場合や、他のモードでフォーマットする場合は、strftime()関数を使用してフォーマットすることができます。見る:

>>> now.strftime('%Y-%m-%d %H:%M')
'2013-06-26 00:14'
20
Victor Aurélio

extraはDjango 2.で非推奨になりました

文字列化された日時を取得するための最良の解決策は次のとおりだと思う理由です:

foo_bar = FooBarModel.objects.annotate(
    str_datetime=Cast(
        TruncSecond('some_datetime_field', DateTimeField()), CharField()
    )
).values('str_datetime').first()

結果は

foo_bar.str_datetime:
(str)'2014-03-28 15:36:55'

また、あなたが好きな方法でフォーマットすることもできます:

from Django.db.models import Value

foo_bar = FooBarModel.objects.annotate(
    day=Cast(ExtractDay('some_datetime_field'), CharField()),
    hour=Cast(ExtractHour('some_datetime_field'), CharField()),
    str_datetime=Concat(
        Value('Days: '), 'day', Value(' Hours: '), 'hour', 
        output_field=CharField()
    )
).values('str_datetime').first()

結果は

foo_bar.str_datetime:
(str)'Days: 28 Hours: 15'
8
Eugene Kovalev

Postgresを使用している場合は、次のようにできます( date format options here )。解決策はデータベースに依存しますが、クエリを実行した後Python landにある長いリストをループ処理するよりも確実です。

qs = MyModel.objects.filter(name='me')
qs = qs.extra(select={'datestr':"to_char(activation_date, 'YYYY-MM-DD HH24:MI:SS')"})
qs = qs.values_list('datestr')

MySQLにはPostgresのto_charと同等の機能があるはずですが、私はMySQLの男ではないので、自分でそれを見つける必要があります。

6
PKKid
qs = MyModel.objects.filter(name='me')
qs = qs.extra(select={'datestr':"DATE_FORMAT(activation_date, '%Y-%m-%d')"})
qs = qs.values_list('datestr')
3
Anoop

こうやってやった

.annotate(date_str=ExpressionWrapper(
            Func(F('date'), Value('%d/%m/%Y %H:%i'), function='DATE_FORMAT'), output_field=CharField()
        ))
1
Camille Tolsa

map関数を使用して、クエリセットの日付を文字列に変換することもできます。例:

qs = MyModel.objects.filter(name='me').values_list('activation_date', flat=True)
data = map(str, qs)
1
kangfend