我正在使用 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(使用前将#替换为@)