使用DateTimeField和timedelta默认的Django迁移

时间:2016-01-21 06:02:54

标签: python django

我在我的一个Django模型上设置默认datetime时遇到问题

from django.db import models
from django.utils import timezone

class MyModel(models.Model):
    my_datetime = models.DateTimeField(default=timezone.now() + timezone.timedelta(+14))

问题是我每次运行makemigrations时都会在该字段上创建一个新的迁移,默认值序列化为该值等于 now

migrations.AlterField(
    model_name='mymodel',
    name='my_datetime',
    field=models.DateTimeField(default=datetime.datetime(2016, 2, 4, 5, 56, 7, 800721, tzinfo=utc)),
    )

无论如何我可以为将来的DateTimeField设置默认值吗?

3 个答案:

答案 0 :(得分:6)

问题是你将表达式的结果置于默认值。相反,您需要将默认值指定为可调用的所需内容。 这是一个例子:

from django.db import models
from django.utils import timezone

def default_time():
    return timezone.now() + timezone.timedelta(+14)

class MyModel(models.Model):

    my_datetime = models.DateTimeField(default=default_time)

答案 1 :(得分:0)

我是Django的新手,所以我无法为您提供从零开始的解决方案。但这是一个有趣的问题,所以我做了一些谷歌搜索,我想我找到了一个与你的完全相同的问题/答案。

Django default=timezone.now + delta

默认需要一个可调用的,所以你只需编写一个函数来做你想做的事情,然后将其作为参数提供:”

def one_day_hence():
    return timezone.now() + timezone.timedelta(days=1)

class MyModel(models.Model):
    ...
    key_expires = models.DateTimeField(default=one_day_hence)

答案 2 :(得分:0)

from django.db import models
from django.utils import timezone

class MyModel(models.Model):
    my_datetime = models.DateTimeField(auto_add_now=True)

运行makemigrations时的迁移

migrations.CreateModel(
    name='MyModel',
    fields=[
        ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
        ('my_datetime', models.DateTimeField(auto_now_add=True)),
    ],
),