【问题标题】:Django models: default datetime is not translated into SQL CURRENT_TIMESTAMPDjango 模型:默认日期时间未转换为 SQL CURRENT_TIMESTAMP
【发布时间】:2020-12-16 12:00:45
【问题描述】:

我正在使用 Django 模型来创建 PostgreSQL-DB。我有一个 DateTimeField 我想将当前时间戳设置为默认值。我知道有多个来源建议如何做到这一点。但是,当我在 Django 之外检查我的数据库时,不会显示默认时间戳。

我尝试过的方法:

1.

created_at = models.DateTimeField(auto_now_add=True)
from django.db.models.functions import Now
...
created_at = models.DateTimeField(default=Now())
from django.utils.timezone import now
...
created_at = models.DateTimeField(default=now)

我希望 PostgreSQL 数据库显示: TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP

它显示的是timestamp with time zone not null,但没有默认值。任何关于如何做到这一点的想法将不胜感激。

【问题讨论】:

  • 不,这是由 Django 自己管理的。
  • 显然是这样,但是有没有办法添加这个默认值?当我从另一个服务(不是 django)添加值时遇到问题。对于这些服务,没有默认值。
  • 只需手动将其添加到数据库中。
  • 好的,但是没有办法通过 django 模型做到这一点?谢谢!
  • 据我所知没有,除了进行迁移和使用RunSQL:docs.djangoproject.com/en/3.1/ref/migration-operations/#runsql 这样做的好处是 Django 将使用它的迁移管理工具来做到这一点,这样你不必手动更改数据库。

标签: django postgresql django-models timestamp


【解决方案1】:

但是,当我在 Django 之外检查我的数据库时,不会显示默认时间戳。

没错,Django 自己管理默认值。不是数据库,Django 还管理ON DELETE 触发器,而不是数据库。这提供了更大的灵活性。例如,您可以像使用default=now 一样将可调用对象传递给default。此可调用对象可以执行复杂的操作来确定默认值,例如进行额外查询、API 调用、文件 I/O 等。这在数据库端使用默认值是不可能的。

您可以制作数据迁移文件并手动更改表。您可以使用以下方法初始化数据迁移:

python manage.py <b>makemigrations --empty</b> <i>app_name</i>

接下来您可以更改它生成的文件并指定默认值:

# Generated by Django 3.1 on 2020-12-16 17:14
from django.db import migrations

class Migration(migrations.Migration):

    dependencies = [
        ('app_name', 'migration_name'),
    ]

    operations = [
        migrations.RunSQL(
            'ALTER TABLE table_name ALTER COLUMN created_at SET DEFAULT CURRENT_TIMESTAMP';
        )
    ]

这样做的好处是 Django 管理迁移,因此它会迁移尚未迁移的数据库,从而添加一个默认值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多