我有這樣一個查詢集:轉換日期時間字段,以在Django queryset.values_list()字符串
qs = MyModel.objects.filter(name='me').values_list('activation_date')
這裏activation_date是DateTimeField字段的車型。 當我從這個QS下載Excel表時,我沒有得到字符串格式的激活日期。 如何在字符串中轉換此字段('activation_date')或如何在qs中轉換它?
我有這樣一個查詢集:轉換日期時間字段,以在Django queryset.values_list()字符串
qs = MyModel.objects.filter(name='me').values_list('activation_date')
這裏activation_date是DateTimeField字段的車型。 當我從這個QS下載Excel表時,我沒有得到字符串格式的激活日期。 如何在字符串中轉換此字段('activation_date')或如何在qs中轉換它?
https://docs.djangoproject.com/en/dev/ref/models/fields/#datetimefield
一個日期和時間,通過一個datetime.datetime實例在Python表示。
你可以得到一個DateTimeField字段的字符串表示直接澆鑄:
str(obj)
# obj = qs[0][0] ? or qs[0][1] ?
你會得到結果像這樣(在這個例子中,我使用datetime.datetime.now()因爲DateTimeField字段是通過datetime.datetime代表的是同樣的行爲):
>>> 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'
有沒有什麼辦法讓月直接在文本的時間(例如11 = 11月)? – dietbacon
@dietbacon你試過'now.strftime('%B')'? –
如果您使用的是Postgres,可以這樣做(date format options here)。該解決方案依賴於數據庫,但在執行查詢之後,它肯定會跳過Python列表中的長列表循環。
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的傢伙。
qs = MyModel.objects.filter(name='me')
qs = qs.extra(select={'datestr':"DATE_FORMAT(activation_date, '%Y-%m-%d')"})
qs = qs.values_list('datestr')
第二行應該是: ''qs = qs.extra(select = {'datestr':'DATE_FORMAT(activation_date,'%% Y - %% m - %% d')「}) ''' – user2002692
您還可以使用map
函數將queryset中的日期轉換爲字符串。例如:
qs = MyModel.objects.filter(name='me').values_list('activation_date', flat=True)
data = map(str, qs)
extra
是在Django 2棄用。0
這就是爲什麼我認爲最好的辦法來獲得字符串化的日期時間爲:
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'
你缺少'平= TRUE' – karthikr