Python 如何将timedelta与timezone.now作为默认值一起使用?
在Django模型中,如何使用Python 如何将timedelta与timezone.now作为默认值一起使用?,python,django,django-models,Python,Django,Django Models,在Django模型中,如何使用timezone.now增加日期字段 工作: end_date = models.DateTimeField(default=timezone.now() + timezone.timedelta(days=365)) 不工作 end_date = models.DateTimeField(default=timezone.now + timezone.timedelta(days=365)) 我认为时区。现在,是一个每次创建对象时都会运行的函数。因此会发生错误
timezone.now
增加日期字段
工作:
end_date = models.DateTimeField(default=timezone.now() + timezone.timedelta(days=365))
不工作
end_date = models.DateTimeField(default=timezone.now + timezone.timedelta(days=365))
我认为
时区。现在,
是一个每次创建对象时都会运行的函数。因此会发生错误。您可以使用以下函数:
def f():
return timezone.now() + timezone.timedelta(days=365)
...
end_date = models.DateTimeField(default=f)
默认情况下,只要创建新的结束日期
,该时区中的当前时间将与时间增量一起添加:
>>> from django.utils import timezone
>>> from datetime import timedelta
>>> def f():
... return timezone.now() + timezone.timedelta(days=365)
...
>>> f()
datetime.datetime(2018, 6, 25, 19, 42, 49, 761389, tzinfo=<UTC>)
>>> f()
datetime.datetime(2018, 6, 25, 19, 43, 2, 953158, tzinfo=<UTC>)
来自django.utils导入时区的>>
>>>从日期时间导入时间增量
>>>def():
... 返回timezone.now()+timezone.timedelta(天=365)
...
>>>f()
datetime.datetime(2018,6,25,19,42,49761389,tzinfo=)
>>>f()
datetime.datetime(2018,6,25,19,43,2953158,tzinfo=)
使用Django运行的示例:
In [1]: from testapp import models
In [2]: models.Test.objects.create().date_added
Out[2]: datetime.datetime(2018, 6, 25, 20, 5, 28, 316214, tzinfo=<UTC>)
In [3]: models.Test.objects.create().date_added
Out[3]: datetime.datetime(2018, 6, 25, 20, 5, 33, 114624, tzinfo=<UTC>)
[1]中的:来自testapp导入模型
在[2]中:添加了models.Test.objects.create().date\u
Out[2]:datetime.datetime(2018,6,25,20,5,28,316214,tzinfo=)
在[3]中:添加了models.Test.objects.create().date\u
Out[3]:datetime.datetime(2018,6,25,20,5,33114624,tzinfo=)
一个好方法是使用post\u save
信号。用
从django.db.models.signals导入post_save
,然后创建如下处理程序函数:
def handler_function(sender, instance, created, **kwargs):
if sender == YourModel and created:
instance.end_date = timezone.now() + timezone.timedelta(days=365)
instance.save()
post_save.connect(handler_function, sender=YourModel)
这肯定会奏效,我希望这也适用于你的情况。如果你需要进一步的帮助,请告诉我 但当我运行django makemigrations时,我得到了
ValueError:无法序列化函数:lambda
@RajagopalSubramanian,我已经更新了。lambda不可序列化,我没有记住。对不起。。。在使用timezone.now()时,在runtimesee中没有设置时间:@RajagopalSubramanian不,这是不同的。您不能直接传递timezone.now()
,在这个时区中,它接收调用,并且在对象创建时有常量值。这里,调用每次创建新值的函数时将调用时区.now
。您可以通过反复调用函数来轻松检查这一点。factory函数应该只处理默认情况,而不是为每个对象指定一个固定日期。学术上,您能给我举个例子吗?由于我不确定我是否理解这种情况下的区别,当您在模型对象上设置非默认的end\u date
时,它会在post\u save
中被此过程覆盖,这与模型字段中的default=…
不同。是的,与post_save
信号相关的此方法的使用旨在在模型定义中没有默认值的情况下使用。