Django 模型:默认日期时间未转换为 SQL CURRENT_TIMESTAMP

2024-05-18

我正在使用 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还管理ON DELETE触发器,而不是数据库。这提供了更大的灵活性。例如,您可以将可调用对象传递给default就像你做的那样default=now。这个可调用可以执行复杂的操作来确定默认值,例如进行额外的查询、API 调用、文件 I/O 等。这在数据库端的默认值是不可能的。

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

python manage.py makemigrations --empty app_name

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

# 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 管理迁移,因此它将迁移尚未迁移的数据库,从而添加默认值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 模型:默认日期时间未转换为 SQL CURRENT_TIMESTAMP 的相关文章

随机推荐