class FullDateTimeCast(Func):
"""
Coerce an expression to a new field type.
"""
function = 'TO_CHAR'
template = '%(function)s(%(expressions)s, \'FMDay, Month DD, YYYY at HH12:MI:SS AM\')'
queryset = FooBarModel.objects.values(my_datetime=FullDateTimeCast('some_datetime_field', TextField()))
foo_bar = queryset.first()
foo_bar['my_datetime']
>>> u' Thursday, October 03, 2019 at 17:59:37 PM'
class DateToChar(models.Func):
"""
Custom Func expression to convert datetimes to str's in database query
Params for initializer
------
expression_1
expression resulting in a date: ex: F('date')
expression_2
Format string as an expression: Value('YYYY-MM-DD')
"""
arity = 2
function = 'to_char'
output_field = models.CharField()
9条答案
按热度按时间n3ipq98p1#
https://docs.djangoproject.com/en/2.2/ref/models/fields/#datetimefield
一个日期和时间,在Python中由datetime.datetime示例表示。
可以直接转换
DateTimeField
得到它的字符串表示:您将得到如下结果(在本例中,我使用
datetime.datetime.now()
,因为DateTimeField
由datetime.datetime
表示,这是相同的行为):如果您想要较少信息或以其他模式格式化,您可以使用
strftime()
函数来格式化它们。请参阅:2wnc66cl2#
extra
在Django 2.0中已过时这就是为什么我认为获得字符串化日期时间的最佳解决方案是:
结果为:
我还想提一下,你可以格式化它,以及以任何方式,你想像:
结果为:
pkln4tw63#
extra()
是Django打算在未来某个时候弃用的旧API,我会避免使用它。请尝试以下方法:
这仅适用于支持
to_char
date type formatting function的数据库。默认情况下,Postgres
提供此函数。MSSQL
后端,则可以将to_char
与FORMAT
交换。MySQL
,请使用DATE_FORMAT
。Oracle
的信息,请参阅他们的文档等。在对查询集求值之后,这将向返回的查询集中的每个对象添加注解
formatted_date
。7jmck4yq4#
如果你使用Postgres,你可以这样做(date format options here)。解决方案依赖于数据库,但它肯定比在Python中循环通过一个长列表强,而且在你执行查询之后。
我确信MySQL有一些与Postgres的to_char等效的功能,但您必须自己找到,因为我不是MySQL的人。
hujrc8aj5#
非常惊讶地看到没有人建议将其转换为简单的
TextField
(注意,我使用的是Postgres,因此无法确认是否适用于其他RDBMS):类似地,它也适用于嵌套字段:
或者,也可以使用自定义的
Func
(这里也是特定于Postgres的,但可以针对任何其他RDBMS进行修改):vvppvyoh6#
jdzmm42g7#
您也可以使用
map
函数将queryset中的日期转换为字符串。示例:hivapdat8#
我是这样做的
luaexgnf9#
如果你只做过一次,请参考Yannic Hamann的答案。然而,如果你发现自己经常从数据库转换为str,你可以将Func定义为一个类,以避免输入output_field和函数。
请注意,函数会根据数据库后端而改变。这是为Postgres编写的。
这可以像这样使用
或与任何产生日期/日期时间/整数/浮点数/十进制字段的表达式(请参阅Postgres to_char。因数据库而异)和产生字符字段或文本字段的表达式一起使用。
有关详细信息,请参阅Func文档