【问题标题】:Postgres doesn't store system time in the databasePostgres 不在数据库中存储系统时间
【发布时间】:2020-06-27 09:37:51
【问题描述】:

我正在使用 docker-compose 作为注册表单,其中 api 和数据库位于不同的容器中。 注册响应显示我想要的系统日期和时间,但在 postgres 日期字段中显示不正确的数据,我不知道它使用的是哪种时间格式。代码是用 python 和 Django 框架编写的。请帮助我。 以下是邮递员的回复:

{
    "success": 1,
    "msg": "Registration Success",
    "details": {
      "email": "test22@gmail.com",
      "mobile_num": "5698745210",
      "date_joined": "2020-06-27T14:43:28.329284",
      "user_type": [
         "Companion",
         "Community"
       ],
      "otp_verified": false
     }
}

这里 date_joined 字段选择系统日期时间,这不是我关心的问题,但在 postgres 数据库中,数据是这样的:

 2020-06-27 09:13:28.329284+00
 

注册的时间是下午 2:30,但是 postgres 显示的是 9:13。 模型源码在这里:

now = datetime.datetime.now()
class User(AbstractBaseUser, PermissionsMixin):
  email = models.EmailField(max_length=40, unique=True)
  date_joined = models.DateTimeField(default=now)
  user_type = ArrayField(models.CharField(max_length = 20))
  mobile_num = models.CharField(max_length = 15)
  otp_verified = models.BooleanField(default=False)

此外,每当我重新构建容器时,docker 将日志显示为:

django_app_1     | /usr/local/lib/python3.6/site-packages/django/db/models/fields/__init__.py:1421: RuntimeWarning: DateTimeField User.date_joined received a naive datetime (2020-06-27 14:43:28.329284) while time zone support is active.
django_app_1     |   RuntimeWarning)

谁能告诉我哪里出错了?

【问题讨论】:

    标签: postgresql django-models docker-compose python-datetime django-timezone


    【解决方案1】:

    你在服务器启动时评估now(),所以它每次都会添加服务器启动的时间作为默认值。您可以改为传递一个可调用对象,例如:

    from django.utils.timezone import now
    
    class User(PermissionsMixin, AbstractBaseUser):
        email = models.EmailField(max_length=40, unique=True)
        date_joined = models.DateTimeField(default=now)
        user_type = ArrayField(models.CharField(max_length=20))
        mobile_num = models.CharField(max_length=15)
        otp_verified = models.BooleanField(default=False)

    因此,这里我们不是传递datetime对象,而是一个将生成datetime对象的函数。

    不过,最好使用auto_now_add=True parameter [Django-doc]

    class User(PermissionsMixin, AbstractBaseUser):
        email = models.EmailField(max_length=40, unique=True)
        date_joined = models.DateTimeField(auto_now_add=True)
        user_type = ArrayField(models.CharField(max_length=20))
        mobile_num = models.CharField(max_length=15)
        otp_verified = models.BooleanField(default=False)

    【讨论】:

      猜你喜欢
      • 2021-01-13
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2018-06-08
      • 2012-06-26
      • 1970-01-01
      相关资源
      最近更新 更多