为 Django DateField 和 Postgresql 指定默认值

Posted

技术标签:

【中文标题】为 Django DateField 和 Postgresql 指定默认值【英文标题】:Specifying a default value for Django DateField and Postgresql 【发布时间】:2016-04-25 17:05:47 【问题描述】:

我正在运行 Django 1.9.5 和 PostgreSQL 9.5。我的应用的模型是:

from django.db import models

class users(models.Model):
    userId = models.AutoField(primary_key=True)
    userUserKey = models.CharField(max_length=255)
    userUserName = models.CharField(max_length=255)
    userLastName = models.CharField(max_length=255)
    userFirstName = models.CharField(max_length=255)
    userActive = models.IntegerField()
    userStartEmployment = models.DateField(default='2015-01-01")
    userEndEmployment = models.DateField(null=True)

迁移文件显示:

...
('userStartEmployment', models.DateField(default='2015-01-01')),
...

sqlmigrate 显示:

BEGIN;
--
-- Create model users
--
CREATE TABLE "login_users" (
    "userId" serial NOT NULL PRIMARY KEY, 
    "userUserKey" varchar(255) NOT NULL, 
    "userUserName" varchar(255) NOT NULL, 
    "userLastName" varchar(255) NOT NULL, 
    "userFirstName" varchar(255) NOT NULL, 
    "userActive" integer NOT NULL, 
    "userStartEmployment" date NOT NULL, 
    "userEndEmployment" date NULL);
COMMIT;

当我运行 migrate 时,没有错误,并且创建的表没有任何默认值。这在 SQL 中是微不足道的。从 PostgreSQL 创建表脚本:

"userStartEmployment" date DEFAULT '2015-01-01'::date,

我很想放弃使用 Django,但我真的很想弄清楚如何尽可能多地利用该框架。

我怎样才能设置一个作为设定值的默认值(即不是从default=datetime.now 之类的东西派生的)?

【问题讨论】:

【参考方案1】:

Django 从不在数据库中设置默认值。不过,它会很乐意使用您给它的任何值作为默认值,因此完全可以传递静态日期:

userStartEmployment = models.DateField(default=datetime.date(2015,1,1))

【讨论】:

如果我理解你在说什么,我不会用 Django 得到我用原始 SQL 脚本得到的东西。但是,通过使用框架(即模型)向数据库添加值,每当我向数据库添加新记录时,Django 都会看到默认日期值'2015-01-01'。我有这个权利吗?

以上是关于为 Django DateField 和 Postgresql 指定默认值的主要内容,如果未能解决你的问题,请参考以下文章

Django Forms 中的 DateField 显示为简单的文本输入

DateField 的 Django 模型过滤器不起作用

仅显示月份和年份的 Django DateField 日历?

在 django 模型中加密 DateField?

django DateTimeField和DateField和TimeField

Django Model DateField 和输入夹具