Django:updated_at / created_at字段有TZ信息也是#34;"精确

时间:2016-08-21 16:43:23

标签: python django-models

我的环境:Django 1.9.7,Python 3.5.2

我使用以下模型代码将值强制转换为模型类中的--xmlfilterupdated_at字段。

created_at

创建新模型对象时,我的数据库中的这个字段如下所示:

class MyObject(models.Model):
   ...
   ...
   ...
   created_at = models.DateTimeField(db_index=True, auto_now_add=True)
   updated_at = models.DateTimeField(db_index=True, auto_now=True)

很高兴知道我可以测量到微秒级的东西,但理想情况下我希望这些字段精确到秒。我真的不需要更多,而且我不需要TZ。

|          created_at           |          updated_at           |
+-------------------------------+-------------------------------+
| 2016-08-20 15:21:34.959854-04 | 2016-08-20 15:21:34.959924-04 |
| 2016-08-20 15:21:34.977791-04 | 2016-08-20 15:21:34.97785-04  |
| 2016-08-20 15:21:34.979975-04 | 2016-08-20 15:21:34.980013-04 |
| 2016-08-20 15:21:34.981981-04 | 2016-08-20 15:21:34.982019-04 |
| 2016-08-20 15:21:34.983878-04 | 2016-08-20 15:21:34.983917-04 |
| 2016-08-20 15:21:34.985832-04 | 2016-08-20 15:21:34.98587-04  |
| 2016-08-20 15:21:34.987758-04 | 2016-08-20 15:21:34.987796-04 |
| 2016-08-20 15:21:34.989791-04 | 2016-08-20 15:21:34.989855-04 |

在我的项目| created_at | updated_at | +-------------------------------+-------------------------------+ | 2016-08-20 15:21:34 | 2016-08-20 15:21:34 | | 2016-08-20 15:21:34 | 2016-08-20 15:21:34 | | 2016-08-20 15:21:34 | 2016-08-20 15:21:34 | 中,我定义了这个:

settings.py

但时区仍然出现在数据库中。

我的问题是:

  1. 如何确保我的USE_TZ = False updated_at字段中有YYYY-MM-DD HH:MM:SS输出
  2. 如果删除微秒是不可能的 - 如何仅从时间戳中删除TZ?
  3. 如果我确实设法做到了 - 那么在那里没有完整的时间戳会不会有任何负面影响?即Python中已存在的比较函数,它们等等。

1 个答案:

答案 0 :(得分:0)

您可以定义自己的默认值(下面的脚本),但使用auto_now您无法执行任何操作,因为实现不会提供更多内容。

import datetime


def default_datetime():    
    now = datetime.datetime.now()   
    now.replace(microsecond=0)      
    return now


class MyObject(models.Model):   
    ...
    ...
    ...
    created_at = models.DateTimeField(db_index=True, default=default_datetime)
    updated_at = models.DateTimeField(db_index=True, null=False)


my_object = MyObject(
    ...,
    updated_at=default_datetime     
)

来自Django注意:

  

auto_now和auto_now_add选项将始终在创建或更新时使用默认时区中的日期。如果你需要不同的东西,你可能想要考虑简单地使用你自己的可调用默认值或覆盖save()而不是使用auto_now或auto_now_add;或使用DateTimeField而不是DateField,并决定如何在显示时处理从datetime到date的转换。