Django模型:默认日期时间未转换为SQL当前时间戳
我正在使用Django模型创建PostgreSQL数据库。我有一个DateTimeField,我想将当前时间戳设置为默认值。我知道有多个来源建议如何做到这一点。但是,当我在Django之外检查我的DB时,默认时间戳不会显示 我尝试过的方法: 一, 我希望PostgreSQL数据库能够显示:Django模型:默认日期时间未转换为SQL当前时间戳,django,postgresql,django-models,timestamp,Django,Postgresql,Django Models,Timestamp,我正在使用Django模型创建PostgreSQL数据库。我有一个DateTimeField,我想将当前时间戳设置为默认值。我知道有多个来源建议如何做到这一点。但是,当我在Django之外检查我的DB时,默认时间戳不会显示 我尝试过的方法: 一, 我希望PostgreSQL数据库能够显示: TIMESTAMPTZ非空默认当前时间戳 它显示的是时区不为空的时间戳,但没有默认值。任何关于如何做到这一点的想法都将不胜感激 但是,当我在Django之外检查我的DB时,默认时间戳不会显示 这是正确的,
TIMESTAMPTZ非空默认当前时间戳
它显示的是时区不为空的时间戳,但没有默认值。任何关于如何做到这一点的想法都将不胜感激
但是,当我在Django之外检查我的DB时,默认时间戳不会显示
这是正确的,Django本身管理默认值。不是数据库,Django还管理删除时的触发器,而不是数据库。这就提供了更多的灵活性。例如,您可以像对待default=now
一样,将可调用的消息传递给default
。这个可调用函数可以执行复杂的操作来确定默认值,如进行额外的查询、API调用、文件I/O等。在数据库端使用默认值时,这是不可能的
您可以创建数据迁移文件并手动更改表。您可以使用以下方法初始化数据迁移:
python manage.py makemigrations --empty app_name
python manage.py makemigrations--空的应用程序名称
接下来,您可以更改它生成的文件并指定默认值:
# 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 3.1于2020-12-16 17:14生成
从django.db导入迁移
类迁移(migrations.Migration):
依赖项=[
(“应用程序名称”、“迁移名称”),
]
操作=[
migrations.RunSQL(
“ALTER TABLE TABLE_name ALTER COLUMN created_在设置默认当前_时间戳时创建”;
)
]
这样做的好处是Django管理迁移,因此它将迁移尚未迁移的数据库,并因此添加一个默认值。不,这是Django自己管理的。显然是这样,但是有办法添加此默认值吗?当我从另一个服务(不是django)添加值时遇到问题。对于这些服务,没有默认值。只需手动将其添加到数据库中即可。是否确定,但没有办法通过django模型执行此操作?谢谢据我所知,没有,除了进行迁移和使用RunSQL
:这样做的好处是Django将使用其迁移管理工具来实现这一点,因此您不必手动更改数据库。
from django.utils.timezone import now
...
created_at = models.DateTimeField(default=now)
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';
)
]